このページで解決しない高度なJavaのシステム障害はJaTSにお任せください

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ドライバが存在しています。
Page Top

<Q16-2>Servlet,JSPへPOST及びGETで入力した文字が文字化けしてしまいます。


<発生環境>
OS RedHatLinux6.2
JDK JDK1.2
Vender Sun
<A16-2>
ブラウザから送られてくる文字列のエンコードとサーバ側で想定しているエンコードが異なるためです。JISの自動認識等を使って再デコードが必要となります。
Page Top

<Q16-3>propertiesファイルに2バイト文字のプロパティを記述するとjava.util.Properties.load()が失敗してしまいます。


<発生環境>
OS Windows2000
JDK JDK1.3
Vender Sun
<A16-3>
2-5と同様です。
Page Top

<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に置き換えることで、正しく"~"を表示することができます。
Page Top

<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"?>といった指定を行う必要があります。
Page Top

<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")

Page Top

<Q16-7>Cookieに入れた文字が文字化けしてしまいます。


<発生環境>
OS Any
JDK Any
Vender Any
<A16-7>
RFC2109に違反するため、Cookieに多バイト文字を使用することはできません。あらかじめ、URLEncoder.encode()でエンコードしたデータをCookieに格納し、取得する際には、URLDecoder.decode()でデコードする、といった処理が必要です。
Page Top

<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"のみが有効です)
Page Top

注意:本文書の内容に誤りがあり、またこの文書によって不利益を被っても、
Acroquest Technology 株式会社は一切関知いたしません。

  • 現象別Index
  • 原因別Index

Find Bugsバグ詳細

Find Bugs Bug Descriptions日本語版

RSSで更新情報を取得する

RSSとは、ホームページの更新情報を配信する為のフォーマットです。
RSSを利用すると、登録したページの情報が更新された場合に、更新情報を自動的に受け取る事ができます。

詳細

弊社小森が執筆致しました

Javaでオブジェクト指向開発

Javaプログラミング言語習得において、新人プログラマーの最初の障害は「オブジェクト指向の壁」です。
本書は、Javaのソフトウェア開発を中心に事業を発展させてきたAcroquest社の新人教育セミナーを加筆・書籍化したもので、大卒の新人に対して、ゼロからJava言語を教えてきた実績をフィードバックしています。

メールマガジン配信中

Javaトラブルシューティングのメルマガをはじめました!是非ご購読ください

詳細