Trouble 16: 文字コードに関する問題
<Q16-1>データベースPostgreSQL6.4.2の検索結果が文字化けしてしまいます。
| <発生環境> |
| OS |
RedHatLinux |
| JDK |
JDK1.1.8 |
| Vender |
IBM |
- <A16-1>
- PostgreSQL6.4.2の初期のJDBCドライバは文字列をUnicodeに変換する処理がきちんと実装されておらず、JDBCで文字を取得する際にデコードをやり直す処理をいれることで解決できます。
また、現在は、PostgreSQL6.5.xおよび7.0.xなどに対して、DB文字エンコーディング対応JDBCドライバが存在しています。
<Q16-2>Servlet,JSPへPOST及びGETで入力した文字が文字化けしてしまいます。
| <発生環境> |
| OS |
RedHatLinux6.2 |
| JDK |
JDK1.2 |
| Vender |
Sun |
- <A16-2>
- ブラウザから送られてくる文字列のエンコードとサーバ側で想定しているエンコードが異なるためです。JISの自動認識等を使って再デコードが必要となります。
<Q16-3>propertiesファイルに2バイト文字のプロパティを記述するとjava.util.Properties.load()が失敗してしまいます。
| <発生環境> |
| OS |
Windows2000 |
| JDK |
JDK1.3 |
| Vender |
Sun |
<Q16-4>サーバSolaris、クライアントWindowsの場合、文字コード変換に失敗し、全角ハイフンなどが?と表示されてしまいます。
| <発生環境> |
| OS |
Solaris2.5.1 |
| JDK |
JDK1.3 |
| Vender |
Sun |
- <A16-4>
-  ̄、~、∥、¢、£、¬、-といった、変換に失敗する文字テーブルを作成し、該当文字は、クライアントでの表示前に強制的MS-932に変換することで対処できます。
例として、"~"についての対応を示します。
"~"は、Solarisにて日本語を扱うエンコーディングであるEUC-JPからUnicode(UCS-2)へ変換すると0x301Cとなるのに対して、WindowsシフトJIS(=MS-CP932)からUnicode(UCS-2)へ変換すると0xFF5Eとなります。そのため、0x301CをMS-CP932によって表示しようとしても、"~"ではなく、"?"となってしまいます。
従って、サーバから表示しようとする文字の中に、0x301Cが存在していれば、0xFF5Eに置き換えることで、正しく"~"を表示することができます。
<Q16-5>XMLファイルをパースする際に、エラーが発生してしまいます。
XMLファイルから日本語を消去すると問題なく動作しました。
発生した際のエラーメッセージは以下の通りです。
文字変換エラー: "Unconvertible UTF-8 character beginning with 0x95" (行番号が小さすぎる可能性があります)
| <発生環境> |
| OS |
WindowsXP |
| JDK |
JDK1.4 |
| Vender |
Sun |
- <A16-5>
- ヘッダ部で指定したエンコーディング名と、実際のXMLファイルの文字コードが異なっていないかを確認してください。
例として、XMLファイルをシフトJISで保存しているのであれば、ヘッダ部には<?xml version="1.0" encoding="Shift_JIS"?>といった指定を行う必要があります。
<Q16-6>ファイルから読み込んだ文字列が文字化けしてしまいます。
| <発生環境> |
| OS |
Any |
| JDK |
Any |
| Vender |
Any |
- <A16-6>
- 読み込んだファイルの文字コードは何であるか、またどのようにしてファイルを読み込んでいるかを確認してください。
ファイル読み込み時に文字エンコーディングが未指定であった場合、JavaVMは、SolarisであればEUC、WindowsであればシフトJISといったように、プラットホームのデフォルトエンコーディングで読み込みます。
従って、WindowsにてEUCファイルを読み込む場合は、以下のようにエンコーディングを指定する必要があります。
//stream: InputStreamReaderに渡す入力ストリーム
InputStreamReader reader = new InputStreamReader(stream, "EUC_JP")
<Q16-7>Cookieに入れた文字が文字化けしてしまいます。
| <発生環境> |
| OS |
Any |
| JDK |
Any |
| Vender |
Any |
- <A16-7>
- RFC2109に違反するため、Cookieに多バイト文字を使用することはできません。あらかじめ、URLEncoder.encode()でエンコードしたデータをCookieに格納し、取得する際には、URLDecoder.decode()でデコードする、といった処理が必要です。
<Q16-8>InputStreamReaderをデフォルトコンストラクタで初期化し、UTF-8の文字列を読み込んだところ、マルチバイト文字が化けてしまいました。
| <発生環境> |
| OS |
Any |
| JDK |
Any |
| Vender |
Any |
- <A16-8>
- 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 株式会社は一切関知いたしません。