Open棟梁Project - マイクロソフト系技術情報 Wiki
目次 †
概要 †
余談:・・・となると、
StreamにDecorateパターンを適用する
殆どの処理が=エンコーディングと言う事になる。
文字エンコーディング †
ココでは各種、文字エンコーディングの情報を纏めています。
「外字」については、「Windowsの外字」を参照下さい。
文字エンコーディングとは、文字列データを、
異なる文字コード(コードページ)を使用したバイト表現に変換することである。
文字化け †
文字化けは、一般的に、
- エンコーダに適切な文字コード(コードページ)を指定していない
- プラットフォームやユーザ間で使用している外字が異なる
- コードページによっては、変換が不可逆なケースがある
際に発生します。
文字コード(コードページ)指定を大きく誤っている場合は、すぐ気が付くのですが、
- UTF-16(Unicode)
- UTF-8
- Shift JIS
- EUC-JP
一部だけ文字化けする場合のトラブルシュートは苦戦することが多いです。
一部だけ文字化けするパターンは以下の様に分類できると考えます。
- 文字コード(コードページ)指定を大きく間違えていない(微妙に間違っている)
- 例えば、Shift_JISの亜種のコードページ指定を誤っている。
- ISO-2022-JP
- Microsoftコードページ932(CP932)
- MacJapanese?
- 外字領域の定義(見た目)が異なっている。
- この場合、データのエンコード自体は正しく行われている。
- 人間にとっての見た目が、異なっているため文字化けと感じられる。
- 外字についてはこちらを参照:「Windowsの外字」
ポイント †
従って、以下に注意を払う必要があります。
- プラットフォーム
- 実装されている文字コード(コードページやフォント)
- 適用される標準のエンコーディングが何か?
- フォントや外字がインストールされているか?
- ファイル転送(プロトコルに実装されているケース)
- SFU(Microsoft Windows Services for UNIX)
- FTP(ASCIIモード)
- データベースのI/O
Unicode文字列以外のフィールドから入出力する場合、
通常、照合順序で指定したに対応した文字コード(コードページ)
を使用して、エンコード・デコードされる。
事例1 †
プラットフォームに実装されている文字コード(コードページやフォント)に起因する文字化け。
- インターネット上での Windows-31J の利用について ~ NEC 特殊文字・IBM 拡張文字
- IBM 拡張文字等の Windows-31J 独自追加の文字は、
他の JIS X 0208 非登録の CJK統合漢字に比べて、
異機種(OS / アプリケーション)間でのデータ交換を、
文字化けを起こしたりせずにデータのやり取りが正常に行える確率が高い。
- しかし、JIS X 0208 非登録の文字をサポートしない環境があることを考えると、
JIS X 0208 登録文字だけを用いてデータ交換を行った方が、問題が起こりにくい。
事例2 †
プラットフォームで適用される標準のエンコーディングに起因する文字化け。
- .NETでは標準で、Shift_JIS=MS932となるが、
- Javaでは Shift_JIS ≠ MS932となるため、
事例3 †
フォントや外字のインストール状況に起因する文字化け。
事例4 †
コードページによっては、変換が不可逆なケースがある。
- JA16SJIS→Unicode方向への変換において、
Unicodeの文字データにU+FF5Eが渡されると0x8160に変換される。
- 逆向きのJA16SJIS→Unicode方向への変換において、
JA16SJISの入力データに0x8160が渡されると、U+FF5EではなくU+301Cに変換される。
この変換はあくまでもUnicodeからJA16SJIS方向への片方向の変換においてのみ適用される。
コードページ †
- Windows-31J
Windows 3.1 (J) のリリースに合わせて、マイクロソフトが
IBM と日本電気 (NEC) のコードを統合して作った符号化文字集合。
1993 年以降、マイクロソフトが自社のドキュメント等で「CP932」という用語を使って
表している対象は、常にこの「Windows-31J」である。この名前は IANA に登録されている。
- MS932
Java で、「IBM のコードページ 932」と「Windows-31J」を区別するための用語。
- CP932
MS-DOS と Windows における日本語コードページを表す用語。
「Windows-31J」が制定されるまでは、OEM ベンダによって文字集合が違う。
- MS 漢字コード
「CP932」とほぼ同じ意味の用語である。
マイクロソフトが(Shift_JIS という符号化方式を)策定したという点や、
マイクロソフトが(JIS X 0208 という文字集合に対して)文字を独自に追加した点を
強調したい場合に用いられる。また、単に「シフト JIS」のことを指している場合もある。
- OEM コードページ 932
Windows 3.1 日本語版の発売以前における、OEM ベンダ各自の拡張を許した仕様の文字セット。
以下は、マイクロソフトから離れ、現在では公的機関からも認められた文字符号化方式を指す用語。
- シフト JIS
JIS X 0208 符号化文字集合を一定の規則に従ってシフトした文字符号化方式。
具体的な内容は JIS X 0208:1997 に「シフト符号化表現」として記載がある。
しかし、文脈によってはベンダ拡張されたコードセットを指している場合もある。
- Shift_JIS
「シフトJIS」の IANA 登録名。
- SJIS
Shift_JIS の短縮形。Java では Shift_JIS と同義語。
その他のエンコーディング †
SGML文書 †
HTMLエンコーディング †
文字参照(数値文字参照・文字実体参照)のエンコーディング(エスケープ)を行う。
- 表記方法により「数値文字参照」と「文字実体参照」の二種が存在する。
- 数値文字参照
10 or 16進数で該当文字をISO 10646の文字番号で指定する方法。
指定の文字コードで表現できない文字を表記、参照する。
- 文字実体参照
特定のキーワード文字列で該当文字(主にマークアップで使われる文字)を指定する方法。
XSS(クロスサイト・スクリプティング)対策としても使用される。
HTMLの文字エンコーディング †
HTTPヘッダか、metaタグにエンコーディングを指定することで
WWWブラウザがデコードする際に指定する文字コード(コードページ)を指定する。
XMLの文字エンコーディング †
ヘッダ部分の記述をDOMが理解して自動的にエンコード・デコードします。
<?xml version="1.0" encoding="Shift_JIS">
URLエンコーディング †
- 概要
- URIにおいて使用できない文字を使う際に行われるエンコード(エスケープ)を行う。
- RFC3986のSection 2.1で定義されている。
- 利用シーン
- Query String経由でデータを受け渡す場合にも使用する。
Base64エンコーディング †
- 利用シーン
- ByteデータをTextベースのプロトコル(SMTP,HTTP等)に乗せる場合に使用する。
各種フォーマット †
Excelが開くことが可能なCSVファイル †
CSVファイルを扱い際は、以下のことに気を付ける。
Excelにて文字化けやエラーが発生せず読み込めるCSVファイルは、
以下の2種類のエンコードのファイルである。
- BOM付きUTF-8
- 各言語(国)のANSIコード
各言語(国)のANSIコード(一例)
# | 言語 | 文字セット名 | codepage |
1 | 日本語 | Shift-JIS | 932 |
2 | 英語(米国) | Windows-1252 | 1252 |
3 | 英語(英国) | Windows-1252 | 1252 |
4 | フランス語(フランス) | Windows-1252 | 1252 |
5 | スペイン語(スペイン) | Windows-1252 | 1252 |
6 | 繁体字中国語 | big5 | 950 |
7 | 簡体字中国語 | gb2312 | 936 |
8 | 韓国語 | ks_c_5601-1987 | 949 |
Excel上でCSV形式で保存すると、ANSIコードで保存される。
参考 †