- PR -

文字化け

1
投稿者投稿内容
たいき
会議室デビュー日: 2002/05/11
投稿数: 14
投稿日時: 2002-06-24 21:19
日本語の文字化けに悩まされています。
当サイト以外にも文字化けの情報は多いので見たのですが、
いまいちわかりませんので、皆さんの力をお借りしたく投稿しました。

環境は、
サーバ:UNIX(EUC)、クライアント:win98、DB:oracle 9i(EUC) で
weblogic6.1J を使って、Servlet,JSP の開発をしています。

文字化けの内容は「−」:全角マイナスが表示できないというものです。
SJIS、MS932が…とかの説明がweb上にあるので、試行錯誤してみました。
結果、文字コードを全て「SJIS」で統一すると、@とかの文字は逆に
表示できなくなるものの、「−」は表示されます。
「MS932」で統一すると、「−」が表示されない一方で、@は表示されるんですね。

これはフォーム中の日本語項目の取込みからDB登録、その表示までの処理で
得られた結果です。
また、別の処理として、UTF-8ファイルを読込んで、内容を表示する処理が
ありますが、これも同様の結果が得られます。

上記だと着目点が難しいかと思い、UTF-8ファイル処理を、
別の視点からwindowsとUNIX上双方で試してみました。

試したソースは、下記の通りで、UTF-8 のファイルを読込んで、1行ずつ表示するだけです。
<ソース>
import java.util.*;
import java.sql.*;
import java.io.*;

class CodeHenkan {

public static void main(String args[]) {

try {

String fileName = args[0]; // ファイル名
String enc = args[1]; // ファイルの文字コード

// 指定文字コードでファイルオープン
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), enc));

String str = null;
int i = 0;

while ((str = br.readLine()) != null) {
System.out.println((++i) + "回目");
System.out.println("string1 : " + str);

byte bytes[] = str.getBytes("MS932");
str = new String(bytes, "SJIS");
System.out.println("string2 : " + str);
}


} catch(Throwable e) {
System.out.println("error : " + e.getMessage());
}

}

}


<UTF-8 の入力ファイル:tst.txt の内容>
あいうえお
−〜
かきくけこ
1ABC5


<実行結果(DOS窓)>
% java CodeHenkan tst.txt UTF-8
1回目
string1 : あいうえお
string2 : あいうえお
2回目
string1 : −〜
string2 : ??
3回目
string1 : かきくけこ
string2 : かきくけこ
4回目
string1 : 1ABC5
string2 : 1???5


<実行結果(UNIX:EUC)>
% java CodeHenkan tst.txt UTF-8
1回目
string1 : あいうえお
string2 : あいうえお
2回目
string1 : ?
兼tring2 : −〜
3回目
string1 : かきくけこ
string2 : かきくけこ
4回目
string1 : 1???5
string2 : 1???5


結果を見てみると、
DOS窓では下記の処理前にて、正しく表示されるのですが、
byte bytes[] = str.getBytes("MS932");
str = new String(bytes, "SJIS");
UNIXでは上記の処理後にて、正しく表示されるのです。

同じUTF-8ファイルを入力に、同じソースを使っているのに
この差異はどうして生じるのでしょうか?
コンパイルは、双方のプラットフォーム上で行っています。
日本語処理に詳しい方、助言よろしくお願いします。



しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2002-06-24 23:23
複雑なのでなんともいえないのですが…敗因はEUC。

Java の EUC-JP では機種依存文字は扱えません。Oracle の EUC はどうなんでしょうかね。できなくても文句はいえないかな。

可能ならば、DB を Unicode にして、MS932 で受け、MS932 で出しましょう。

−、〜の文字化けは、Unicode といっても SJIS/EUC/ISO-2022-JP 互換 Unicode と MS932 互換 Unicode があるから。

シフトJIS 8160 -[SJIS]-> Unicode 301C
シフトJIS 8160 -[CP932]-> Unicode FF5E

Unicode 301C -[CP932]-> UNDEFINED
Unicode FF5E -[SJIS] -> UNDEFINED

だからです。

これらの話は、http://rh.vinelinux.org/~shom/sjisprob.hml の 9 文字に起こる可能性があります。(Mac 関係は sjisprob2.html)

# タイムリーな手前味噌:Web+DB Mag

[ メッセージ編集済み 編集者: しょむ 編集日時 2002-06-24 23:29 ]
おがわ
大ベテラン
会議室デビュー日: 2001/08/01
投稿数: 199
お住まい・勤務地: 千葉県
投稿日時: 2002-06-25 00:41
日本語の文字コードについては、こちらのページをご覧下さい。
http://www.ingrid.org/java/i18n/encoding/
なゆう
会議室デビュー日: 2002/06/25
投稿数: 1
投稿日時: 2002-06-25 02:07
ハイフンに注目すると、多分、入力データとして作成したUTF-8の
ファイルにはFULLWIDTH HYPHEN-MINUS(0xFF0D)が含まれているの
でしょう。これをWindows上で読み込んでSystem.out.println
で出力すると、出力時にはプラットフォームデフォルトであるMS932
が使われて、0x817Cが出力されます。

JavaのSJIS, EUCエンコーダーで同様の文字を表示するには
MINUS SIGN(0x2212)でなければならないので、
byte bytes[] = str.getBytes("MS932"); // 0xFF0D(Unicode) -> 0x817C(SJIS)
str = new String(bytes, "SJIS"); // 0x817C(SJIS) -> 0x2212(Unicode)
となり、System.out.printlnによる出力時はプラットフォーム
デフォルトのEUCが使われるので、0x2212であれば適切に表示される
のだと思います。
たいき
会議室デビュー日: 2002/05/11
投稿数: 14
投稿日時: 2002-06-25 11:56
みなさん、ありがとうございます。
投稿した後、周囲の人に状況を話してたら、考えもまとまってきました。
webの記事を見ても、全く理解できてなくてお恥ずかしいです。

ご指摘の通り、全角マイナスについて、EUCとMS932でUNICODEの
マッピングが違うことが原因ということが理解できました。
#事前に原因はこれだろうとは認識も、全然理解できてませんでした。
また、UTF−8のファイルについても調べてみます。
<以下は解決したので、削除しました。>

[ メッセージ編集済み 編集者: たいき 編集日時 2002-06-25 13:22 ]
1

スキルアップ/キャリアアップ(JOB@IT)