文字コードの種類
日本語の文字セットは、ISO-2022-JP(JIS)、Shift_JIS、Windows-31J、EUC_JPの4種類である。
Shift_JIS
日本語文字コードの一つ。Microsoft社によって策定された。文字の1バイト目を見るだけで漢字か1バイト文字(いわゆる半角英数字)か分かる、等幅フォントで表示した場合に画面上の桁数とバイト数が一致するなどの特長から、MS-DOSやWindows、Mac OSなど、パソコンの標準文字コードとして広く普及した。
Shiftは小文字、JISは大文字、間はハイフンではなくアンダースコアなので要注意。
Shiftは小文字、JISは大文字、間はハイフンではなくアンダースコアなので要注意。
Windows-31J
別名「Windows Codepage 932」。Shift_JISを拡張した、Windows環境で標準的に用いられている文字セット。
WJavaではJDK 1.2以降で「MS932」という名称でサポートされており、JDK 1.4.1以降はWindows-31JというIANAの正式名称でも利用可能になっている。
Windows-31Jは、以下のようなWindows機種依存文字を含んでおり、JPSのpageディレクティブにSHIFT-JISを指定した場合は以下の文字は文字化けする。
WJavaではJDK 1.2以降で「MS932」という名称でサポートされており、JDK 1.4.1以降はWindows-31JというIANAの正式名称でも利用可能になっている。
Windows-31Jは、以下のようなWindows機種依存文字を含んでおり、JPSのpageディレクティブにSHIFT-JISを指定した場合は以下の文字は文字化けする。
- NEC特殊文字
- ①②③ⅠⅡⅢ㍉㌔㌢№℡㈱など
- IBM特殊文字
- 髙など
MacintoshなどのOSにおける「Shift_JIS」はWindows-31Jとは異なる。例えばWindowsにおけるの文字コード0x8740に対し、Macintoshでは「(日)」というMac機種依存文字が割り当てられている。
ページ内でWindows機種依存文字を使用したいときは、Shift_JISの代わりにWindows-31Jを指定することで文字化けを回避可能なケースもある。Safariでは、文字コードにWindows-31Jが正しく指定されていれば、Windows機種依存文字も表示可能。
ページ内でWindows機種依存文字を使用したいときは、Shift_JISの代わりにWindows-31Jを指定することで文字化けを回避可能なケースもある。Safariでは、文字コードにWindows-31Jが正しく指定されていれば、Windows機種依存文字も表示可能。
ISO-2022-JP
別名JIS。JIS規格によって規定されている日本語の文字コードの一つ。Shift JISコード、日本語EUCと並んでインターネット上でよく使われる文字コードである。
EUC_JP
Extended UNIX Code。
日本語UNIXシステム諮問委員会の提案に基づいて1985年にAT&T社が定めた、複数バイトの文字を扱う文字コードの枠組み。日本語だけでなく複数バイト言語の各国の文字コードが規定されている。日本語のEUCコードを特に「EUC-JP」「日本語EUC」と呼ぶ。
日本語UNIXシステム諮問委員会の提案に基づいて1985年にAT&T社が定めた、複数バイトの文字を扱う文字コードの枠組み。日本語だけでなく複数バイト言語の各国の文字コードが規定されている。日本語のEUCコードを特に「EUC-JP」「日本語EUC」と呼ぶ。
参考:UTF
UCS-2やUCS-4(Unicode)で定義される文字集合を用いて記述された文字列をコンピュータが扱いやすいようにバイト列(数値の列)に変換する方式。1文字を1~6バイト(現状では最長4バイト)の可変長の数値(バイト列)に変換するUTF-8、UCS-2の集合の中にUCS-4の一部の文字を埋め込むためのUTF-16、Unicodeをメールで使用するためのUTF-7、すべてのUCS-4文字を4バイトで表現するUTF-32の4種類がある。
文字コード変換について
概要
Javaでは、すべての文字をUnicodeとして処理している。そのため、JVMが外部に対して文字を出力する際には、Unicode→各種文字コードへの変換が必要になる。逆にJVMが外部から文字を入力する場合は各種文字コード→Unicodeの変換が必要になる。
Webアプリケーションでは、以下のような状況で文字の相互変換が行われる。
Webアプリケーションでは、以下のような状況で文字の相互変換が行われる。
- JSPファイルがサーブレット・コンテナに読み込まれるとき
- Webブラウザからリクエストを受信するとき
- Webブラウザにレスポンスを送信するとき
- データベースやファイルにアクセスするとき
- メールを送受信するとき
変換方式の指定
- pageEncoding
- Webアプリケーションサーバが、外部→JVMにファイルが入力された場合(クライアントからのHTTPリクエスト)、文字セットからUnicodeに変換する際に用いるエンコーディング方式を指定する。
- contentType
- JVMからコンテンツをWebブラウザに出力する際にWebアプリケーションが使用するUnicode→文字セットの変換方式。
相互変換のミスマッチ
たとえば以下のように相互変換方式を指定したとする。
<%@page language="java"
contentType="text/html; charset=Shift_JIS"
pageEncoding="Windows-31J" %>
このとき「~-¢£」などの文字をアプリで使用した場合、文字化けが発生する。
メカニズムは以下のとおり。
メカニズムは以下のとおり。
- ページエンコーディングが「Windows-31J」なので、WASはJSPファイルがWindows-31Jで作成されたものとしてUnicodeに変換する。
- コンテントタイプが「Shift_JIS」なので、WASはUnicodeから「Shift_JIS」に文字コードを変換する。
- 上記に示した文字に対する変換コードポイントが2方式の間で異なるため、元の文字に戻すことができずに文字化けが起こる。
指定方法
contentTypeの指定
JSPがサーバからクライアントにデータを返却する際、pageディレクティブ-contentType-charsetに指定されたエンコーディング方式に従って、Unicodeから各文字セットに変換する。
contentTypeを指定しない場合、デフォルトでは
contentTypeを指定しない場合、デフォルトでは
<%@page contentType="text/html; charset=ISO-8859-1" %>
が指定される。ISO-8859-1は英数字と記号のみの文字セットなので、日本語などの2バイト文字は表示できない。したがって、日本語を扱いたい場合(扱いたくない訳ないがな)以下のように明示的に指定する。
<%@page contentType="text/html; charset=Windows-31J" %>
pageEncodingの指定
クライアントからのリクエストデータを、WASがUnicodeに変換する際のエンコーディング方式を指定する。省略することもできるが、その場合はcontentTypeと同じ方式で変換される。
<%@page pageEncoding="Windows-31J" %>
添付ファイル