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

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
<A7-1>
プラットフォームから取得したエラー文字列がJavaによってUTF-8に変換されていない為です。
JDK1.4.0_02以降を使用することで文字化けを回避できます。他の回避方法としてはLANG環境変数を英語(Cまたはen_US)にする方法があります。

参考URL:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4258198
Page Top

<Q7-2>ダイアログメッセージを改行させたい場合、JOptionPaneに改行コードの含まれる文字列を直接設定してしまうと、改行コードが文字化けして表示されてしまいます。


<発生環境>
OS Windows2000/NT
JDK JDK1.3
Vender Sun
<A7-2>
改行コードの含まれる文字列を、String型の配列に変換してから、JOptionPaneに設定してください。
Page Top

<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">
Page Top

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


<発生環境>
OS Any
JDK Any
Vender Any
<A7-4>
16-7と同様です。
Page Top

<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を参照してください。
Page Top

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

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


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

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

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

Page Top

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


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

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

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

  • 現象別Index
  • 原因別Index

Find Bugsバグ詳細

Find Bugs Bug Descriptions日本語版

RSSで更新情報を取得する

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

詳細

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

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

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

メールマガジン配信中

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

詳細