| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

「Javaでの文字コードの扱い」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
 
(同じ利用者による、間の5版が非表示)
1行目: 1行目:
==Javaでの文字コードの扱い==
+
==[[Javaでの文字コードの扱い]]==
[[Java]]{{category 文字化け}}
+
[[Java]] | [[Category:文字化け]]
  
なんだかんだといつも厄介な文字コードの変換についてのメモ
+
なんだかんだといつも厄介な[[文字コード]]の変換についてのメモ
  
結局、ファイル読込み、文字列変数の取り扱い、ファイル書き込みなどの各局面で、実際はどの文字コードが使用されているかを考え、適切にコンバートすることが肝要
+
結局、ファイル読込み、文字列変数の取り扱い、ファイル書き込みなどの各局面で、実際はどの[[文字コード]]が使用されているかを考え、適切にコンバートすることが肝要
  
 
*[http://www.kanzaki.com/netfan/ インターネットの言葉と技術]
 
*[http://www.kanzaki.com/netfan/ インターネットの言葉と技術]
 
+
*[https://www.typea.info/tips_/index.php/Java%E3%81%A7%E3%81%AE%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%89%B1%E3%81%84  Javaでの文字コードの扱い]
===Javaに限らず、厄介な文字化けについて===
+
===Javaに限らず、厄介な[[文字化け]]について===
{{category 文字化け}}
+
----
 +
[[Category:文字化け]]
  
 
{{amazon|477414164X}}
 
{{amazon|477414164X}}
 
{{amazon|481633243X}}
 
{{amazon|481633243X}}
 
===基本事項===
 
===基本事項===
 
+
----
 
====Stringクラス====
 
====Stringクラス====
 +
----
 
=====仕様では、[http://www.y-adagio.com/public/standards/tr_javalang2/typesValues.doc.html#26992 String クラス]はUnicode文字の並びを表す=====
 
=====仕様では、[http://www.y-adagio.com/public/standards/tr_javalang2/typesValues.doc.html#26992 String クラス]はUnicode文字の並びを表す=====
 
+
----
 
*String クラスのソースコード(%JAVA_HOME%/src.zip)を見ると、Unicode文字の並びをchar型の配列として保持している。
 
*String クラスのソースコード(%JAVA_HOME%/src.zip)を見ると、Unicode文字の並びをchar型の配列として保持している。
 
*[http://e-words.jp/w/Unicode.html char型|http://www.y-adagio.com/public/standards/tr_javalang2/typesValues.doc.html#48440]は、[Unicode]文字を表す16ビット符号無し整数で、'\u0000'~'\uffff' すなわち 0~65535を表現できる
 
*[http://e-words.jp/w/Unicode.html char型|http://www.y-adagio.com/public/standards/tr_javalang2/typesValues.doc.html#48440]は、[Unicode]文字を表す16ビット符号無し整数で、'\u0000'~'\uffff' すなわち 0~65535を表現できる
24行目: 26行目:
  
 
====ソースコードの変換====
 
====ソースコードの変換====
=====ソースコードのコンパイル時、プラットフォームの文字コードやファイルの文字コードに依存してしまう。=====
+
----
 
+
=====ソースコードのコンパイル時、プラットフォームの[[文字コード]]やファイルの[[文字コード]]に依存してしまう。=====
*Windowsでソースを書いてLinuxでコンパイルを行ったりするような場合には、プラットフォームとソースコードの文字コードの不一致によって文字化けが発生する。
+
----
 +
*[[Windows]]でソースを書いてLinuxでコンパイルを行ったりするような場合には、プラットフォームとソースコードの文字コードの不一致によって文字化けが発生する。
 
*[http://www.y-adagio.com/public/standards/tr_javalang2/lexical.doc.html#100850 native2ascii|http://java.sun.com/j2se/1.5.0/ja/docs/ja/tooldocs/windows/native2ascii.html] を使用して、ソースコードに含まれるUnicode以外の文字を、[Unicodeエスケープ]に変換する。
 
*[http://www.y-adagio.com/public/standards/tr_javalang2/lexical.doc.html#100850 native2ascii|http://java.sun.com/j2se/1.5.0/ja/docs/ja/tooldocs/windows/native2ascii.html] を使用して、ソースコードに含まれるUnicode以外の文字を、[Unicodeエスケープ]に変換する。
  
 
=====プロパティファイルの変換=====
 
=====プロパティファイルの変換=====
 +
----
 
*プロパティファイル等、Java プログラムで利用するファイルも、ソースコード同様、[http://java.sun.com/j2se/1.5.0/ja/docs/ja/tooldocs/windows/native2ascii.html native2ascii] を使用して文字コードを変換する。
 
*プロパティファイル等、Java プログラムで利用するファイルも、ソースコード同様、[http://java.sun.com/j2se/1.5.0/ja/docs/ja/tooldocs/windows/native2ascii.html native2ascii] を使用して文字コードを変換する。
  
 
===ファイルの読み書き===
 
===ファイルの読み書き===
プログラムの実行時にファイルを読込む必要がある場合等は、ファイルに合わせた文字コードでファイルを読まなければ文字化けしてしまう場合がある。
+
プログラムの実行時にファイルを読込む必要がある場合等は、ファイルに合わせた[[文字コード]]でファイルを読まなければ文字化けしてしまう場合がある。
====文字コードを指定してファイルを読む====
+
====[[文字コード]]を指定してファイルを読む====
=====FileInputStream を利用することにより、文字コードを指定してファイルを読むことができる=====
+
----
  BufferedReader reader   
+
=====FileInputStream を利用することにより、[[文字コード]]を指定してファイルを読むことができる=====
   = new BufferedReader(new InputStreamReader(new FileInputStream("/var/files/ebicdic.txt"),"Cp943c"));
+
----
====文字コードを指定してファイルを書く====
+
  Buffered[[R]]eader reader   
=====FileInputStream を利用することにより、文字コードを指定してファイルを書くことができる=====
+
   = new Buffered[[R]]eader(new InputStream[[R]]eader(new FileInputStream("/var/files/ebicdic.txt"),"Cp943c"));
 +
====[[文字コード]]を指定してファイルを書く====
 +
----
 +
=====FileInputStream を利用することにより、[[文字コード]]を指定してファイルを書くことができる=====
 +
----
 
  BufferedWriter writer  
 
  BufferedWriter writer  
 
     = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("c:\\shift_jis.txt"), "MS932"))
 
     = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("c:\\shift_jis.txt"), "MS932"))
  
===文字コードの変換===
+
===[[文字コード]]の変換===
 +
----
 
<blockquote>nicodeで定義された文字集合で表現された文字列" から "バイト列" へのエンコード方法、逆にデコード方法を指定する。</blockquote>
 
<blockquote>nicodeで定義された文字集合で表現された文字列" から "バイト列" へのエンコード方法、逆にデコード方法を指定する。</blockquote>
  
 
====エンコード====
 
====エンコード====
 +
----
 
=====エンコード方式(文字セット)を指定して、Stringからバイト列を取得する=====
 
=====エンコード方式(文字セット)を指定して、Stringからバイト列を取得する=====
 +
----
 
  byte[] String.getBytes(String charsetName)
 
  byte[] String.getBytes(String charsetName)
 +
 
*java.lang.StringCoding.encode(String charsetName, char[] value ...)
 
*java.lang.StringCoding.encode(String charsetName, char[] value ...)
 
*sun.io.CharToByteConverter
 
*sun.io.CharToByteConverter
  
 
====デコード====
 
====デコード====
 +
----
 
=====デコード方式(文字セット)を指定して、バイト列からStringを生成する=====
 
=====デコード方式(文字セット)を指定して、バイト列からStringを生成する=====
 +
----
 
  new String(byte[] bytes, String charsetName)
 
  new String(byte[] bytes, String charsetName)
 
*java.lang.StringCoding.decode(String charsetName, byte[] bytes ...)
 
*java.lang.StringCoding.decode(String charsetName, byte[] bytes ...)
 
*sun.io.ByteToCharConverter
 
*sun.io.ByteToCharConverter
  
====文字コードの変換====
+
====[[文字コード]]の変換====
=====上記を使用して、文字コードを変換する=====
+
----
 +
=====上記を使用して、[[文字コード]]を変換する=====
 +
----
 
  String newCode = new String(oldCode.getBytes("Cp930"), "MS932");
 
  String newCode = new String(oldCode.getBytes("Cp930"), "MS932");
  
 
====デフォルトエンコード(デコード)====
 
====デフォルトエンコード(デコード)====
=====エンコード(デコード)方式を指定しないと、プラットフォームのデフォルトエンコーディングが使用される。=====
+
----
 +
=====エンコード(デコード)方式を指定しないと、プラットフォームのデフォルト[[エンコーディング]]が使用される。=====
 +
----
  
 
システムプロパティ
 
システムプロパティ
81行目: 99行目:
 
|line.separator
 
|line.separator
 
|行のセパレータ
 
|行のセパレータ
|CRLF
+
|C[[R]]LF
 
|-
 
|-
 
|}
 
|}
87行目: 105行目:
 
*sun.io.Converters.getDefaultEncodingName()
 
*sun.io.Converters.getDefaultEncodingName()
  
====文字コードの16進ダンプ====
+
====[[文字コード]]の16進ダンプ====
 +
----
 
=====デバッグ用=====
 
=====デバッグ用=====
 +
----
 
   public static String stringDump(String s) {
 
   public static String stringDump(String s) {
 
     if (s == null) return "";
 
     if (s == null) return "";
98行目: 118行目:
 
     return buf.toString();
 
     return buf.toString();
 
   }
 
   }
====文字コードの16進ダンプを復元====
+
====[[文字コード]]の16進ダンプを復元====
 +
----
 
=====デバッグ用=====
 
=====デバッグ用=====
 +
----
 
   public static String decodeDumpString(String s) {
 
   public static String decodeDumpString(String s) {
 
     StringBuffer result = new StringBuffer();
 
     StringBuffer result = new StringBuffer();
115行目: 137行目:
 
   }
 
   }
  
====エンコーディング====
+
====[[エンコーディング]]====
*文字コード
+
----
 +
*[[文字コード]]
 
*[http://ja.wikipedia.org/wiki/Microsoft%E3%82%B3%E3%83%BC%E3%83%89%E3%83%9A%E3%83%BC%E3%82%B8932 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 Microsoftコードページ932]
 
*[http://ja.wikipedia.org/wiki/Unicode Unicode]
 
*[http://ja.wikipedia.org/wiki/Unicode Unicode]
  
=====Javaでサポートされるエンコーディング=====
+
=====Javaでサポートされる[[エンコーディング]]=====
 +
----
 
*[http://java.sun.com/j2se/1.3/ja/docs/ja/guide/intl/encoding.doc.html 1.3|http://java.sun.com/j2se/1.3/docs/guide/intl/encoding.doc.html]([日本語])
 
*[http://java.sun.com/j2se/1.3/ja/docs/ja/guide/intl/encoding.doc.html 1.3|http://java.sun.com/j2se/1.3/docs/guide/intl/encoding.doc.html]([日本語])
 
*[http://java.sun.com/j2se/1.4/ja/docs/ja/guide/intl/encoding.doc.html 1.4|http://java.sun.com/j2se/1.4/docs/guide/intl/encoding.doc.html]([日本語])
 
*[http://java.sun.com/j2se/1.4/ja/docs/ja/guide/intl/encoding.doc.html 1.4|http://java.sun.com/j2se/1.4/docs/guide/intl/encoding.doc.html]([日本語])
 
*[http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/intl/encoding.doc.html 1.5|http://java.sun.com/j2se/1.5.0/docs/guide/intl/encoding.doc.html]([日本語])
 
*[http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/intl/encoding.doc.html 1.5|http://java.sun.com/j2se/1.5.0/docs/guide/intl/encoding.doc.html]([日本語])
  
=====エンコーディングの別名一覧=====
+
=====[[エンコーディング]]の別名一覧=====
 +
----
 
*[http://www2s.biglobe.ne.jp/~katsum/java/encoding.html sun.io.CharacterEncoding]
 
*[http://www2s.biglobe.ne.jp/~katsum/java/encoding.html sun.io.CharacterEncoding]
  
=====その他=====
+
=====[[その他]]=====
 +
----
 
*MS932またはSJISの別名として定義されており、どちらの別名となるかはバージョンに依存している(JDK 1.3ではMS932だが、JDK 1.4ではSJISとなる)。
 
*MS932またはSJISの別名として定義されており、どちらの別名となるかはバージョンに依存している(JDK 1.3ではMS932だが、JDK 1.4ではSJISとなる)。
 
*http://www.atmarkit.co.jp/fjava/rensai2/webopt08/webopt08.html
 
*http://www.atmarkit.co.jp/fjava/rensai2/webopt08/webopt08.html
  
=====CP943cとShift_JISの文字コードの違いについて=====
+
=====CP943cとShift_JISの[[文字コード]]の違いについて=====
*http://www-1.ibm.com/support/docview.wss?uid=std3b32aea767378855449256f010028e2f4
+
----
 +
*http://www-1.ibm.com/support/doc[[vi]]ew.wss?uid=std3b32aea767378855449256f010028e2f4
  
 
===マルチパートのエンコード===
 
===マルチパートのエンコード===
====ファイルアップロードの場合にファイル名が文字化けする====
+
----
 +
====ファイルアップロードの場合にファイル名が[[文字化け]]する====
 +
----
 
=====Form=====
 
=====Form=====
 +
----
 
  <form id="formUpload" action="upload.html" method="POST" enctype="multipart/form-data" >
 
  <form id="formUpload" action="upload.html" method="POST" enctype="multipart/form-data" >
 
   <input name="attach_file" />
 
   <input name="attach_file" />
143行目: 173行目:
 
  </form>
 
  </form>
  
=====文字コードをiso-8859-1として変換=====
+
=====[[文字コード]]をiso-8859-1として変換=====
*http://ja.wikipedia.org/wiki/ISO/IEC_8859-1
+
----
*Spring の場合
+
*http://ja.wikipedia.org/wiki/ISO/[[IE]]C_8859-1
 +
*[[Spring]] の場合
  
  @RequestMapping(value="/upload.html", method = RequestMethod.POST)
+
  @[[R]]equestMapping(value="/upload.html", method = [[R]]equestMethod.POST)
 
  public String uploadFile(MultipartFile file) {
 
  public String uploadFile(MultipartFile file) {
 
     String filename = new String(file.getOriginalFilename().getBytes("iso-8859-1"),"utf-8");
 
     String filename = new String(file.getOriginalFilename().getBytes("iso-8859-1"),"utf-8");
 
                 :
 
                 :
  
====ファイルダウンロード時にファイル名が文字化けする====
+
====ファイルダウンロード時にファイル名が[[文字化け]]する====
  //String fileName = new String(originalFileName.getBytes("utf-8"),"iso-8859-1"); // Chrome OK, IE NG
+
----
  String fileName = new String(originalFileName.getBytes("ms932"),"iso-8859-1"); // Chrome OK, IE OK
+
  //String fileName = new String(originalFileName.getBytes("utf-8"),"iso-8859-1"); // Chrome OK, [[IE]] NG
 +
  String fileName = new String(originalFileName.getBytes("ms932"),"iso-8859-1"); // Chrome OK, [[IE]] OK
 
   
 
   
  response.setHeader("Content-Type", "application/octet-stream");
+
  response.set[[Header]]("Content-Type", "application/octet-stream");
  response.setHeader("Content-Disposition", "filename=\"" + fileName + "\"");
+
  response.set[[Header]]("Content-Disposition", "filename=\"" + fileName + "\"");
 
   
 
   
 
===Shift_JISの取り扱い===
 
===Shift_JISの取り扱い===
 +
----
  
 
*MS932またはSJISの別名として定義されており、どちらの別名となるかはバージョンに依存している(JDK 1.3ではMS932だが、JDK 1.4ではSJISとなる)。
 
*MS932またはSJISの別名として定義されており、どちらの別名となるかはバージョンに依存している(JDK 1.3ではMS932だが、JDK 1.4ではSJISとなる)。
*機種依存文字(NEC特殊文字、NEC選定IBM拡張文字、IBM拡張文字)や~∥-¢£¬などの扱いが異なり、誤って使用すると“?”に文字化け
+
*機種依存文字(NEC特殊文字、NEC選定IBM拡張文字、IBM拡張文字)や~∥-¢£¬などの扱いが異なり、誤って使用すると“?”に[[文字化け]]
  
 
*http://www.atmarkit.co.jp/fjava/rensai2/webopt08/webopt08.html
 
*http://www.atmarkit.co.jp/fjava/rensai2/webopt08/webopt08.html
  
*文字コード 参照
+
*[[文字コード]] 参照
  
 
=====円記号=====
 
=====円記号=====
*Shift_JISでは、半角円記号とバックスラッシュを区別しないが、する文字コード体系だと見た目上は、半角円記号なのに、Stringのメソッドが正しく動作しない(ように見える)
+
----
 +
*Shift_JISでは、半角円記号とバックスラッシュを区別しないが、する[[文字コード]]体系だと見た目上は、半角円記号なのに、Stringのメソッドが正しく動作しない(ように見える)
 
  String str1 = "\u005c\u005c";
 
  String str1 = "\u005c\u005c";
 
  String str2 = "\u00a5";
 
  String str2 = "\u00a5";
177行目: 211行目:
 
  \ = \
 
  \ = \
 
  false
 
  false
===ファイルの文字コードを判別する===
+
===ファイルの[[文字コード]]を判別する===
*[Java ファイルの文字コードを判別する] [ファイルの文字コードを判別する]
+
----
===その他===
+
*[[Java ファイルの文字コードを判別する|ファイルの文字コードを判別する]]
 +
===[[その他]]===
 +
----
 
{{amazon|4774107808}}
 
{{amazon|4774107808}}
====Webアプリケーションの文字化け対策====
+
====[[Webアプリケーション]]の文字化け対策====
*Filterで文字化け対策
 
*文字化けの対処
 
 
----
 
----
 +
*[[Filterで文字化け対策]]
 +
*[[文字化けの対処]]
 +
 
{{amazon|4822282775}}
 
{{amazon|4822282775}}
Java5.0でだいぶ機能追加があったけれど、丁寧に説明してくれてます。
+
[[Java5]].0でだいぶ機能追加があったけれど、丁寧に説明してくれてます。
 
試験対策でなくても非常に有用
 
試験対策でなくても非常に有用
  
 
{{amazon|482228168X}}
 
{{amazon|482228168X}}
 
ただ、試験範囲から外れちゃったところも多いので、こちらの本もあわせて読んでおくとよいかも(もったいないか?)
 
ただ、試験範囲から外れちゃったところも多いので、こちらの本もあわせて読んでおくとよいかも(もったいないか?)
{{include_html banner_html, "!amazon_promotion2"}}
+
{{include_html [[banner_html]], "!amazon_promotion2"}}
  
===その他文字化けについて===
+
===その他[[文字化け]]について===
{{category 文字化け}}
+
----
*Excel VBA 文字列をバイト配列に変換
+
[[Category:文字化け]]
*Filterで文字化け対策
+
*[[Excel VBA 文字列をバイト配列に変換]]
*HTML javascript:を利用するとデコードされる
+
*[[Filterで文字化け対策]]
*J2EE Tips
+
*[[HTML javascript:を利用するとデコードされる]]
*Java ファイルの文字コードを判別する
+
*[[J2EE Tips]]
*Javaでの文字コードの扱い
+
*[[Java ファイルの文字コードを判別する]]
*Linux バックスペースが文字化けしてしまう
+
*[[Javaでの文字コードの扱い]]
*Python URLエンコード
+
*[[Linux バックスペースが文字化けしてしまう]]
*Python UnicodeEncodeError の対処
+
*[[Python URLエンコード]]
*Python ファイルの文字コード
+
*[[Python UnicodeEncodeError の対処]]
*SQL Plus
+
*[[Python ファイルの文字コード]]
*WAS から Java Mail送信で文字化け
+
*[[SQL Plus]]
*vi
+
*[[WAS から Java Mail送信で文字化け]]
*画面に入力された文字コードを調べる
+
*[[vi]]
*文字コード
+
*[[画面に入力された文字コードを調べる]]
*文字化けの対処
+
*[[文字コード]]
 +
*[[文字化けの対処]]

2021年8月10日 (火) 05:28時点における最新版

目次

Javaでの文字コードの扱い

Java |

なんだかんだといつも厄介な文字コードの変換についてのメモ

結局、ファイル読込み、文字列変数の取り扱い、ファイル書き込みなどの各局面で、実際はどの文字コードが使用されているかを考え、適切にコンバートすることが肝要

Javaに限らず、厄介な文字化けについて


基本事項


Stringクラス


仕様では、String クラスはUnicode文字の並びを表す

  • String クラスのソースコード(%JAVA_HOME%/src.zip)を見ると、Unicode文字の並びをchar型の配列として保持している。
  • char型|http://www.y-adagio.com/public/standards/tr_javalang2/typesValues.doc.html#48440は、[Unicode]文字を表す16ビット符号無し整数で、'\u0000'~'\uffff' すなわち 0~65535を表現できる
  • Javaで扱うUnicodeは、1文字を16ビット(2バイト)UCS-2である。
  • 現在はUnicode全体は4バイトで定義(UCS-4)されている。

ソースコードの変換


ソースコードのコンパイル時、プラットフォームの文字コードやファイルの文字コードに依存してしまう。

プロパティファイルの変換

  • プロパティファイル等、Java プログラムで利用するファイルも、ソースコード同様、native2ascii を使用して文字コードを変換する。

ファイルの読み書き

プログラムの実行時にファイルを読込む必要がある場合等は、ファイルに合わせた文字コードでファイルを読まなければ文字化けしてしまう場合がある。

文字コードを指定してファイルを読む


FileInputStream を利用することにより、文字コードを指定してファイルを読むことができる

BufferedReader reader  
  = new BufferedReader(new InputStreamReader(new FileInputStream("/var/files/ebicdic.txt"),"Cp943c"));

文字コードを指定してファイルを書く


FileInputStream を利用することにより、文字コードを指定してファイルを書くことができる

BufferedWriter writer 
   = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("c:\\shift_jis.txt"), "MS932"))

文字コードの変換


<blockquote>nicodeで定義された文字集合で表現された文字列" から "バイト列" へのエンコード方法、逆にデコード方法を指定する。</blockquote>

エンコード


エンコード方式(文字セット)を指定して、Stringからバイト列を取得する

byte[] String.getBytes(String charsetName)
  • java.lang.StringCoding.encode(String charsetName, char[] value ...)
  • sun.io.CharToByteConverter

デコード


デコード方式(文字セット)を指定して、バイト列からStringを生成する

new String(byte[] bytes, String charsetName)
  • java.lang.StringCoding.decode(String charsetName, byte[] bytes ...)
  • sun.io.ByteToCharConverter

文字コードの変換


上記を使用して、文字コードを変換する

String newCode = new String(oldCode.getBytes("Cp930"), "MS932");

デフォルトエンコード(デコード)


エンコード(デコード)方式を指定しないと、プラットフォームのデフォルトエンコーディングが使用される。

システムプロパティ

名前 説明
file.encoding デフォルトのコード系 MS932
file.encoding.pkg コード系を取り扱うパッケージ sun.io
line.separator 行のセパレータ CRLF
  • System.getProperty("file.encoding")
  • sun.io.Converters.getDefaultEncodingName()

文字コードの16進ダンプ


デバッグ用

 public static String stringDump(String s) {
   if (s == null) return "";
   StringBuffer buf = new StringBuffer();
   char[] c = s.toCharArray();
   for (int i=0; i<c.length; i++) {
     buf.append(Integer.toString((int)c[i], 16) + " ");
   }
   return buf.toString();
 }

文字コードの16進ダンプを復元


デバッグ用

 public static String decodeDumpString(String s) {
   StringBuffer result = new StringBuffer();
   StringTokenizer tok = new StringTokenizer(s.trim(), " "); 
   
   List lst = new ArrayList();
   while(tok.hasMoreTokens()) {
     lst.add(new Character((char)Integer.parseInt(tok.nextToken(),16)));
   }
   char[] buf = new char[lst.size()];
   for (int i=0; i<lst.size(); i++) {
     buf[i] = ((Character)lst.get(i)).charValue();
   }
   return (new String(buf));
 }

エンコーディング


Javaでサポートされるエンコーディング

エンコーディングの別名一覧

その他

CP943cとShift_JISの文字コードの違いについて

マルチパートのエンコード


ファイルアップロードの場合にファイル名が文字化けする


Form

<form id="formUpload" action="upload.html" method="POST" enctype="multipart/form-data" >
  <input name="attach_file" />
  <input type="submit" value="アップロード"/>
</form>
文字コードをiso-8859-1として変換

@RequestMapping(value="/upload.html", method = RequestMethod.POST)
public String uploadFile(MultipartFile file) {
    String filename = new String(file.getOriginalFilename().getBytes("iso-8859-1"),"utf-8");
                :

ファイルダウンロード時にファイル名が文字化けする


//String fileName = new String(originalFileName.getBytes("utf-8"),"iso-8859-1"); // Chrome OK, IE NG
String fileName = new String(originalFileName.getBytes("ms932"),"iso-8859-1"); // Chrome OK, IE OK

response.setHeader("Content-Type", "application/octet-stream");
response.setHeader("Content-Disposition", "filename=\"" + fileName + "\"");

Shift_JISの取り扱い


  • MS932またはSJISの別名として定義されており、どちらの別名となるかはバージョンに依存している(JDK 1.3ではMS932だが、JDK 1.4ではSJISとなる)。
  • 機種依存文字(NEC特殊文字、NEC選定IBM拡張文字、IBM拡張文字)や~∥-¢£¬などの扱いが異なり、誤って使用すると“?”に文字化け
円記号

  • Shift_JISでは、半角円記号とバックスラッシュを区別しないが、する文字コード体系だと見た目上は、半角円記号なのに、Stringのメソッドが正しく動作しない(ように見える)
String str1 = "\u005c\u005c";
String str2 = "\u00a5";
System.out.println(str1 + " = " + str2);
System.out.println(str1.equals(str2));
\ = \
false

ファイルの文字コードを判別する


その他


Webアプリケーションの文字化け対策


Java5.0でだいぶ機能追加があったけれど、丁寧に説明してくれてます。 試験対策でなくても非常に有用

ただ、試験範囲から外れちゃったところも多いので、こちらの本もあわせて読んでおくとよいかも(もったいないか?) {{include_html banner_html, "!amazon_promotion2"}}

その他文字化けについて