- - PR -
文字化け
1
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 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ファイルを入力に、同じソースを使っているのに この差異はどうして生じるのでしょうか? コンパイルは、双方のプラットフォーム上で行っています。 日本語処理に詳しい方、助言よろしくお願いします。 |
|
投稿日時: 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 ] |
|
投稿日時: 2002-06-25 00:41
日本語の文字コードについては、こちらのページをご覧下さい。
http://www.ingrid.org/java/i18n/encoding/ |
|
投稿日時: 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-06-25 11:56
みなさん、ありがとうございます。
投稿した後、周囲の人に状況を話してたら、考えもまとまってきました。 webの記事を見ても、全く理解できてなくてお恥ずかしいです。 ご指摘の通り、全角マイナスについて、EUCとMS932でUNICODEの マッピングが違うことが原因ということが理解できました。 #事前に原因はこれだろうとは認識も、全然理解できてませんでした。 また、UTF−8のファイルについても調べてみます。 <以下は解決したので、削除しました。> [ メッセージ編集済み 編集者: たいき 編集日時 2002-06-25 13:22 ] |
1
