文字コード
参考サイト
@IT > Java Solution > 短期集中連載:Javaの文字化け対策FAQ
第1回 Webブラウザが文字コードを判定する基準は?
http://www.atmarkit.co.jp/fjava/rensai3/mojibake01/mojibake01.html
第2回 JSPで特殊文字が文字化けする場合の対処方法
http://www.atmarkit.co.jp/fjava/rensai3/mojibake02/mojibake02.html
第3回 DBや入力フォームで文字化けする場合の対処方法
デフォルト・エンコーディングは、Windows上のJVMではWindows-31J(MS932)となり、UNIXではLANG変数で設定された文字コード(EUC-JPやUTF-8など)になる。そのため、例えばWindows上で開発した成果物をLinuxサーバ上で運用するケースなどにおいて、デフォルト・エンコーティングの違いによる文字化けが発生しやすい。
Javaアプリケーション開発では、自分が書いたコードがデフォルト・エンコーティングに依存しないように心掛けよう。例えばテキスト・ファイルを読み込む場合は、以下のようにFileInputStreamクラスとInputStreamReaderクラスで実装にすればよいだろう。
InputStreamReader isr = new InputStreamReader( new FileInputStream("filename.txt"), "Windows-31J");
この方法であれば、InputStreamReaderクラスのコンストラクタで文字コードを明示的に記述でき、デフォルト・エンコーティングに依存しない実装となる。
第4回 JSPのインクルードに関連する文字化けを解消
http://www.atmarkit.co.jp/fjava/rensai3/mojibake04/mojibake04.html
その他
Wikipedia Microsoftコードページ932
http://ja.wikipedia.org/wiki/Microsoft%E3%82%B3%E3%83%BC%E3%83%89%E3%83%9A%E3%83%BC%E3%82%B8932
Shift_JISのエイリアスの変更について
http://www.ingrid.org/java/i18n/unicode.html
文字コードの墓場 - しいしせねっと
http://siisise.net/charset.html
検証
よく使うエンコーディング
- Windows-31J
- Shift_JIS
- MS932
- euc-jp
- euc-jp-linux
正式名と別名
- EUC-JP
- eucjis
- x-eucjp
- csEUCPkdFmtjapanese
- eucjp
- Extended_UNIX_Code_Packed_Format_for_Japanese
- x-euc-jp
- euc_jp
- ISO-2022-JP
- jis
- jis_encoding
- csjisencoding
- csISO2022JP
- iso2022jp
- JIS_X0201
- JIS_X0201
- X0201
- JIS0201
- csHalfWidthKatakana
- JIS_X0212-1990
- jis_x0212-1990
- iso-ir-159
- x0212
- JIS0212
- csISO159JISX02121990
- Shift_JIS
- shift-jis
- x-sjis
- ms_kanji
- shift_jis
- csShiftJIS
- sjis
- pck
- UTF-16
- UTF_16
- UTF-8
- UTF8
- windows-31j
- csWindows31J
- windows-932
- MS932
- x-JIS0208
- JIS_C6626-1983
- JIS0208
- csISO87JISX0208
- x0208
- JIS_X0208-1983
- iso-ir-87
- x-euc-jp-linux
- euc_jp_linux
- euc-jp-linux
- x-eucJP-Open
- EUC_JP_Solaris
- eucJP-open
エンコーディング一覧取得
- ソース
import java.nio.charset.Charset; import java.util.Iterator; import java.util.SortedMap; public class ListCharsets { public static void main(String[] args) { // 全ての Charset を取得 SortedMap charsets = Charset.availableCharsets(); Iterator ci = charsets.keySet().iterator(); while (ci.hasNext()) { // それぞれの Charset について Charset charset = Charset.forName((String)ci.next()); // 全ての別名を取得 String names = charset.toString() + " ("; Iterator ai = charset.aliases().iterator(); while (ai.hasNext()) { String alias = (String) ai.next(); names += " " + alias.toString(); } names += ")"; // 名前と別名を出力 System.out.println(names); } } }
WindowsXP+jdk1.4.2_08
Big5 ( csBig5) Big5-HKSCS ( big5-hkscs Big5_HKSCS big5hkscs) EUC-JP ( eucjis x-eucjp csEUCPkdFmtjapanese eucjp Extended_UNIX_Code_Packed_Format_for_Japanese x-euc-jp euc_jp) EUC-KR ( ksc5601 5601 ksc5601_1987 ksc_5601 ksc5601-1987 euc_kr ks_c_5601-1987 euckr csEUCKR) GB18030 ( gb18030-2000) GBK ( windows-936 CP936) ISO-2022-JP ( jis jis_encoding csjisencoding csISO2022JP iso2022jp) ISO-2022-KR ( ISO2022KR csISO2022KR) ISO-8859-1 ( iso-ir-100 8859_1 ISO_8859-1 ISO8859_1 819 csISOLatin1 IBM-819 ISO_8859-1:1987 latin1 cp819 ISO8859-1 IBM819 ISO_8859_1 l1) ISO-8859-13 ( iso8859_13) ISO-8859-15 ( 8859_15 csISOlatin9 IBM923 cp923 923 L9 IBM-923 ISO8859-15 LATIN9 ISO_8859-15 LATIN0 csISOlatin0 ISO8859_15_FDIS ISO-8859-15) ISO-8859-2 ( l2 iso-ir-101 ISO_8859-2:1987 ISO_8859-2 latin2 csISOLatin2 iso8859_2 ISO8859-2) ISO-8859-3 () ISO-8859-4 ( iso-ir-110 l4 latin4 csISOLatin4 iso8859_4 ISO_8859-4:1988 ISO_8859-4) ISO-8859-5 ( cyrillic iso8859_5 ISO_8859-5 iso-ir-144 csISOLatinCyrillic) ISO-8859-6 () ISO-8859-7 ( greek8 ECMA-118 sun_eu_greek ELOT_928 ISO_8859-7:1987 iso-ir-126 ISO_8859-7 iso8859_7 greek csISOLatinGreek) ISO-8859-8 () ISO-8859-9 ( iso-ir-148 latin5 l5 ISO_8859-9 ISO_8859-9:1989 csISOLatin5 iso8859_9) JIS_X0201 ( JIS_X0201 X0201 JIS0201 csHalfWidthKatakana) JIS_X0212-1990 ( jis_x0212-1990 iso-ir-159 x0212 JIS0212 csISO159JISX02121990) KOI8-R ( koi8 cskoi8r) Shift_JIS ( shift-jis x-sjis ms_kanji shift_jis csShiftJIS sjis pck) TIS-620 () US-ASCII ( ISO646-US IBM367 ASCII cp367 ascii7 ANSI_X3.4-1986 iso-ir-6 us 646 iso_646.irv:1983 csASCII ANSI_X3.4-1968 ISO_646.irv:1991) UTF-16 ( UTF_16) UTF-16BE ( X-UTF-16BE UTF_16BE ISO-10646-UCS-2) UTF-16LE ( UTF_16LE X-UTF-16LE) UTF-8 ( UTF8) windows-1250 ( cp1250) windows-1251 ( cp1251) windows-1252 ( cp1252) windows-1253 ( cp1253) windows-1254 ( cp1254) windows-1255 () windows-1256 () windows-1257 ( cp1257) windows-1258 () windows-31j ( csWindows31J windows-932 MS932) x-EUC-CN ( gb2312 EUC_CN euccn euc-cn gb2312-80 gb2312-1980) x-euc-jp-linux ( euc_jp_linux euc-jp-linux) x-EUC-TW ( cns11643 euc_tw EUC-TW euctw) x-eucJP-Open ( EUC_JP_Solaris eucJP-open) x-ISCII91 ( iscii ST_SEV_358-88 iso-ir-153 csISO153GOST1976874 ISCII91) x-JIS0208 ( JIS_C6626-1983 JIS0208 csISO87JISX0208 x0208 JIS_X0208-1983 iso-ir-87) x-Johab ( johab ms1361 ksc5601-1992 ksc5601_1992) x-MS950-HKSCS ( MS950_HKSCS) x-mswin-936 ( ms936 ms_936) x-windows-949 ( windows949 ms_949 ms949) x-windows-950 ( windows-950 ms950)
文字コード変換
- http://developer.java.sun.com/developer/technicalArticles/Programming/sprintf/PrintfFormat.java を取得
- ソース
import java.io.UnsupportedEncodingException; public class Test03 { public static void main(String[] args) { System.out.println(outputEncodingBytes('A')); System.out.println(outputEncodingBytes('1')); System.out.println(outputEncodingBytes('あ')); System.out.println(outputEncodingBytes('ア')); System.out.println(outputEncodingBytes('A')); System.out.println(outputEncodingBytes('−')); System.out.println(outputEncodingBytes('〜')); } static String outputEncodingBytes(char c1) { String str = c1 + " :"; try { str += outputBytes(c1); str += outputBytes(c1, "Shift-JIS"); str += outputBytes(c1, "MS932"); str += outputBytes(c1, "euc-jp"); str += outputBytes(c1, "euc-jp-linux"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return str; } static String outputBytes(char c, String encoding) throws UnsupportedEncodingException { return " " + encoding + "(" + hexBytes(new String("" + c).getBytes(encoding)) + ")"; } static String outputBytes(char c) { return " default(" + hexBytes(new String("" + c).getBytes()) + ")"; } static String hexBytes(byte[] bytes) { String output = ""; for (int count = 0; count < bytes.length; count++) { String hex = new PrintfFormat("%2x").sprintf(bytes[count]); output += " 0x" + hex.substring(hex.length() - 2, hex.length()); } return output; } }
WindowsXP + jdk1.4.2_04
A : default( 0x41) Shift-JIS( 0x41) MS932( 0x41) euc-jp( 0x41) euc-jp-linux( 0x41) 1 : default( 0x31) Shift-JIS( 0x31) MS932( 0x31) euc-jp( 0x31) euc-jp-linux( 0x31) あ : default( 0x82 0xa0) Shift-JIS( 0x82 0xa0) MS932( 0x82 0xa0) euc-jp( 0xa4 0xa2) euc-jp-linux( 0xa4 0xa2) ア : default( 0x83 0x41) Shift-JIS( 0x83 0x41) MS932( 0x83 0x41) euc-jp( 0xa5 0xa2) euc-jp-linux( 0xa5 0xa2) A : default( 0x82 0x60) Shift-JIS( 0x82 0x60) MS932( 0x82 0x60) euc-jp( 0xa3 0xc1) euc-jp-linux( 0xa3 0xc1) − : default( 0x81 0x7c) Shift-JIS( 0x21 0x29) MS932( 0x81 0x7c) euc-jp( 0x21 0x29) euc-jp-linux( 0x21 0x29) 〜 : default( 0x81 0x60) Shift-JIS( 0x21 0x29) MS932( 0x81 0x60) euc-jp( 0x8f 0xa2 0xb7) euc-jp-linux( 0x21 0x29)
WindowsXP + jdk1.4.2_05
A : default( 0x41) Shift-JIS( 0x41) MS932( 0x41) euc-jp( 0x41) euc-jp-linux( 0x41) 1 : default( 0x31) Shift-JIS( 0x31) MS932( 0x31) euc-jp( 0x31) euc-jp-linux( 0x31) あ : default( 0x82 0xa0) Shift-JIS( 0x82 0xa0) MS932( 0x82 0xa0) euc-jp( 0xa4 0xa2) euc-jp-linux( 0xa4 0xa2) ア : default( 0x83 0x41) Shift-JIS( 0x83 0x41) MS932( 0x83 0x41) euc-jp( 0xa5 0xa2) euc-jp-linux( 0xa5 0xa2) A : default( 0x82 0x60) Shift-JIS( 0x82 0x60) MS932( 0x82 0x60) euc-jp( 0xa3 0xc1) euc-jp-linux( 0xa3 0xc1) − : default( 0x81 0x7c) Shift-JIS( 0x21 0x29) MS932( 0x81 0x7c) euc-jp( 0x21 0x29) euc-jp-linux( 0x21 0x29) 〜 : default( 0x81 0x60) Shift-JIS( 0x21 0x29) MS932( 0x81 0x60) euc-jp( 0x8f 0xa2 0xb7) euc-jp-linux( 0x21 0x29)
WindowsXP + jdk1.4.2_07
A : default( 0x41) Shift-JIS( 0x41) MS932( 0x41) euc-jp( 0x41) euc-jp-linux( 0x41) 1 : default( 0x31) Shift-JIS( 0x31) MS932( 0x31) euc-jp( 0x31) euc-jp-linux( 0x31) あ : default( 0x82 0xa0) Shift-JIS( 0x82 0xa0) MS932( 0x82 0xa0) euc-jp( 0xa4 0xa2) euc-jp-linux( 0xa4 0xa2) ア : default( 0x83 0x41) Shift-JIS( 0x83 0x41) MS932( 0x83 0x41) euc-jp( 0xa5 0xa2) euc-jp-linux( 0xa5 0xa2) A : default( 0x82 0x60) Shift-JIS( 0x82 0x60) MS932( 0x82 0x60) euc-jp( 0xa3 0xc1) euc-jp-linux( 0xa3 0xc1) − : default( 0x81 0x7c) Shift-JIS( 0x21 0x29) MS932( 0x81 0x7c) euc-jp( 0x21 0x29) euc-jp-linux( 0x21 0x29) 〜 : default( 0x81 0x60) Shift-JIS( 0x21 0x29) MS932( 0x81 0x60) euc-jp( 0x8f 0xa2 0xb7) euc-jp-linux( 0x21 0x29)
Redhat Linux 9 + jdk1.4.1_05
A : default( 0x41) Shift-JIS( 0x41) MS932( 0x41) euc-jp( 0x41) euc-jp-linux( 0x41) 1 : default( 0x31) Shift-JIS( 0x31) MS932( 0x31) euc-jp( 0x31) euc-jp-linux( 0x31) あ : default( 0xa4 0xa2) Shift-JIS( 0x82 0xa0) MS932( 0x82 0xa0) euc-jp( 0xa4 0xa2) euc-jp-linux( 0xa4 0xa2) ア : default( 0xa5 0xa2) Shift-JIS( 0x83 0x41) MS932( 0x83 0x41) euc-jp( 0xa5 0xa2) euc-jp-linux( 0xa5 0xa2) A : default( 0xa3 0xc1) Shift-JIS( 0x82 0x60) MS932( 0x82 0x60) euc-jp( 0xa3 0xc1) euc-jp-linux( 0xa3 0xc1) − : default( 0xa1 0xdd) Shift-JIS( 0x81 0x7c) MS932( 0x3f) euc-jp( 0xa1 0xdd) euc-jp-linux( 0xa1 0xdd) 〜 : default( 0xa1 0xc1) Shift-JIS( 0x81 0x60) MS932( 0x3f) euc-jp( 0xa1 0xc1) euc-jp-linux( 0xa1 0xc1)
FreeBSD-4.9 + jdk1.4.2-p5
A : default( 0x41) Shift-JIS( 0x41) MS932( 0x41) euc-jp( 0x41) euc-jp-linux( 0x41) 1 : default( 0x31) Shift-JIS( 0x31) MS932( 0x31) euc-jp( 0x31) euc-jp-linux( 0x31) あ : default( 0xa4 0xa2) Shift-JIS( 0x82 0xa0) MS932( 0x82 0xa0) euc-jp( 0xa4 0xa2) euc-jp-linux( 0xa4 0xa2) ア : default( 0xa5 0xa2) Shift-JIS( 0x83 0x41) MS932( 0x83 0x41) euc-jp( 0xa5 0xa2) euc-jp-linux( 0xa5 0xa2) A : default( 0xa3 0xc1) Shift-JIS( 0x82 0x60) MS932( 0x82 0x60) euc-jp( 0xa3 0xc1) euc-jp-linux( 0xa3 0xc1) − : default( 0xa1 0xdd) Shift-JIS( 0x81 0x7c) MS932( 0x3f) euc-jp( 0xa1 0xdd) euc-jp-linux( 0xa1 0xdd) 〜 : default( 0xa1 0xc1) Shift-JIS( 0x81 0x60) MS932( 0x3f) euc-jp( 0xa1 0xc1) euc-jp-linux( 0xa1 0xc1)
RHEL4 + jdk1.4.2_13
A : default( 0x41) Shift-JIS( 0x41) MS932( 0x41) euc-jp( 0x41) euc-jp-linux( 0x41) 1 : default( 0x31) Shift-JIS( 0x31) MS932( 0x31) euc-jp( 0x31) euc-jp-linux( 0x31) あ : default( 0xa4 0xa2) Shift-JIS( 0x82 0xa0) MS932( 0x82 0xa0) euc-jp( 0xa4 0xa2) euc-jp-linux( 0xa4 0xa2) ア : default( 0xa5 0xa2) Shift-JIS( 0x83 0x41) MS932( 0x83 0x41) euc-jp( 0xa5 0xa2) euc-jp-linux( 0xa5 0xa2) A : default( 0xa3 0xc1) Shift-JIS( 0x82 0x60) MS932( 0x82 0x60) euc-jp( 0xa3 0xc1) euc-jp-linux( 0xa3 0xc1) − : default( 0xa1 0xdd) Shift-JIS( 0x81 0x7c) MS932( 0x3f) euc-jp( 0xa1 0xdd) euc-jp-linux( 0xa1 0xdd) 〜 : default( 0xa1 0xc1) Shift-JIS( 0x81 0x60) MS932( 0x3f) euc-jp( 0xa1 0xc1) euc-jp-linux( 0xa1 0xc1)
RHEL + jdk1.5.0_11
A : default( 0x41) Shift-JIS( 0x41) MS932( 0x41) euc-jp( 0x41) euc-jp-linux( 0x41) 1 : default( 0x31) Shift-JIS( 0x31) MS932( 0x31) euc-jp( 0x31) euc-jp-linux( 0x31) あ : default( 0xa4 0xa2) Shift-JIS( 0x82 0xa0) MS932( 0x82 0xa0) euc-jp( 0xa4 0xa2) euc-jp-linux( 0xa4 0xa2) ア : default( 0xa5 0xa2) Shift-JIS( 0x83 0x41) MS932( 0x83 0x41) euc-jp( 0xa5 0xa2) euc-jp-linux( 0xa5 0xa2) A : default( 0xa3 0xc1) Shift-JIS( 0x82 0x60) MS932( 0x82 0x60) euc-jp( 0xa3 0xc1) euc-jp-linux( 0xa3 0xc1) − : default( 0xa1 0xdd) Shift-JIS( 0x81 0x7c) MS932( 0x3f) euc-jp( 0xa1 0xdd) euc-jp-linux( 0xa1 0xdd) 〜 : default( 0xa1 0xc1) Shift-JIS( 0x81 0x60) MS932( 0x3f) euc-jp( 0xa1 0xc1) euc-jp-linux( 0xa1 0xc1)