Trouble 7: 文字化けします
<Q7-1>Solarisにおいて、LANG=ja環境でスタックトレースを出力すると文字化けします。
以下のように出力されました。
java.net.ConnectException: →?陟命乖??霓??陟臓
鳧ava.net.ConnectException: →?陟命乖??霓??陟臓
鱇t java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:295)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:161)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:148)
at java.net.Socket.connect(Socket.java:425)
at java.net.Socket.connect(Socket.java:375)
at java.net.Socket.<init>(Socket.java:290)
at java.net.Socket.<init>(Socket.java:118)
at test.net.ExceptionTest.main(ExceptionTest.java:9)
| <発生環境> |
| OS |
Solaris8 |
| JDK |
JDK1.3.1_06/1.4.0_01 |
| Vender |
Sun |
<Q7-2>ダイアログメッセージを改行させたい場合、JOptionPaneに改行コードの含まれる文字列を直接設定してしまうと、改行コードが文字化けして表示されてしまいます。
| <発生環境> |
| OS |
Windows2000/NT |
| JDK |
JDK1.3 |
| Vender |
Sun |
- <A7-2>
- 改行コードの含まれる文字列を、String型の配列に変換してから、JOptionPaneに設定してください。
<Q7-3>ブラウザ表示時に文字化けが発生してしまいます。
| <発生環境> |
| OS |
Solaris2.5.1 |
| JDK |
JDK1.2.1 |
| Vender |
Sun |
- <A7-3>
- 文字列の再デコードを行います。
(例)String BB = "あいうえお"; ←これが文字化けする場合
String AA = new String(BB.getBytes("Shift_JIS"),"8859_1");
そして、htmlのMETAタグで文字コードを指定します。
(例)<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Shift_JIS">
<Q7-4>Cookieに入れた文字が文字化けしてしまいます。
| <発生環境> |
| OS |
Any |
| JDK |
Any |
| Vender |
Any |
<Q7-5>Servletを実行し、ブラウザで表示させたところ、web.xmlのinit-paramタグで設定した日本語文字列が、文字化けを起こしてしまいます。
| <発生環境> |
| OS |
Any |
| JDK |
Any |
| Vender |
Any |
- <A7-5>
- web.xmlファイル自体のエンコーディングと、XMLのヘッダで指定するエンコーディング指定が異なっていることが考えられます。
例えばEUCエンコーディングで保存されたweb.xmlファイルに
<xml version="1.0" encoding="Shift_JIS"?>
といったヘッダ指定を行っていると、質問にあるような文字化けが発生します。
特に、ヘッダの指定がUTF-8であるのに対してweb.xml自体のエンコーディングがShift-JISやEUCである場合は、XMLファイルのパースに失敗してWebアプリケーション自体の起動に失敗する為注意が必要です。
XMLファイルのエンコーディング指定については16-5を参照してください。
<Q7-6>データベースPostgreSQL6.4.2の検索結果が文字化けしてしまいます。
| <発生環境> |
| OS |
RedHatLinux |
| JDK |
JDK1.1.8 |
| Vender |
IBM |
- <A7-6>
- PostgreSQL6.4.2の初期のJDBCドライバは文字列をUnicodeに変換する処理がきちんと実装されておらず、JDBCで文字を取得する際にデコードをやり直す処理をいれることで解決できます。
また、現在は、PostgreSQL6.5.xおよび7.0.xなどに対して、DB文字エンコーディング対応JDBCドライバが存在しています。
<Q7-7>Servlet,JSPへPOST及びGETで入力した文字が文字化けしてしまいます。
| <発生環境> |
| OS |
RedHatLinux6.2 |
| JDK |
JDK1.2 |
| Vender |
Sun |
- <A7-7>
- ブラウザから送られてくる文字列のエンコードとサーバ側で想定しているエンコードが異なるためです。JISの自動認識等を使って再デコードが必要となります。
<Q7-8>サーバSolaris、クライアントWindowsの場合、文字コード変換に失敗し、全角ハイフンなどが?と表示されてしまいます。
| <発生環境> |
| OS |
Solaris2.5.1 |
| JDK |
JDK1.3 |
| Vender |
Sun |
- <A7-8>
-  ̄、~、∥、¢、£、¬、-といった、変換に失敗する文字テーブルを作成し、該当文字は、クライアントでの表示前に強制的MS-932に変換することで対処できます。
例として、"~"についての対応を示します。
"~"は、Solarisにて日本語を扱うエンコーディングであるEUC-JPからUnicode(UCS-2)へ変換すると0x301Cとなるのに対して、WindowsシフトJIS(=MS-CP932)からUnicode(UCS-2)へ変換すると0xFF5Eとなります。そのため、0x301CをMS-CP932によって表示しようとしても、"~"ではなく、"?"となってしまいます。
従って、サーバから表示しようとする文字の中に、0x301Cが存在していれば、0xFF5Eに置き換えることで、正しく"~"を表示することができます。
<Q7-9>ファイルから読み込んだ文字列が文字化けしてしまいます。
| <発生環境> |
| OS |
Any |
| JDK |
Any |
| Vender |
Any |
- <A7-9>
- 読み込んだファイルの文字コードは何であるか、またどのようにしてファイルを読み込んでいるかを確認してください。
ファイル読み込み時に文字エンコーディングが未指定であった場合、JavaVMは、SolarisであればEUC、WindowsであればシフトJISといったように、プラットホームのデフォルトエンコーディングで読み込みます。
従って、WindowsにてEUCファイルを読み込む場合は、以下のようにエンコーディングを指定する必要があります。
//stream: InputStreamReaderに渡す入力ストリーム
InputStreamReader reader = new InputStreamReader(stream, "EUC_JP")
<Q7-10>Cookieに入れた文字が文字化けしてしまいます。
| <発生環境> |
| OS |
Any |
| JDK |
Any |
| Vender |
Any |
- <A7-10>
- RFC2109に違反するため、Cookieに多バイト文字を使用することはできません。あらかじめ、URLEncoder.encode()でエンコードしたデータをCookieに格納し、取得する際には、URLDecoder.decode()でデコードする、といった処理が必要です。
<Q7-11>InputStreamReaderをデフォルトコンストラクタで初期化し、UTF-8の文字列を読み込んだところ、マルチバイト文字が化けてしまいました。
| <発生環境> |
| OS |
Any |
| JDK |
Any |
| Vender |
Any |
- <A7-11>
- InputStreamReaderは、コンストラクタなどで明示的にエンコーディングを指定しなかった場合プラットフォーム標準のエンコーディングを使用します。
このため、ファイルのエンコーディングとInputStreamReaderのエンコーディングが食い違います。
UTF-8で記述されたファイルを読み込む場合は、以下のようにInputStreamReaderを初期化してください。
//stream: InputStreamReaderに渡す入力ストリーム
InputStreamReader reader = new InputStreamReader(stream, "UTF-8");
※UTF-8は、JDK1.3以前とJDK1.4以降で有効なエンコーディング名が異なります。
(JDK1.3では"UTF8"のみが有効です)
注意:本文書の内容に誤りがあり、またこの文書によって不利益を被っても、
Acroquest Technology 株式会社は一切関知いたしません。