-
Notifications
You must be signed in to change notification settings - Fork 0
MS_CharacterEncoding
- 戻る(国際化対応項目)
文字コードという用語には、以下の 3 つの概念が含まれる。
どのような文字が含まれるか。
各文字に付与されている番号。
どのように文字コード番号を文字に変換するか。
補足(この 3 層の区別が要点): 「文字コード」という一語で
混同されがちな概念を分けているのが本ページの主旨である。
Unicode を例に具体化すると分かりやすい。① 文字集合 … Unicode に「あ」という文字が含まれる ② コード番号 … 「あ」の符号位置は U+3042 ③ エンコーディング … U+3042 をバイト列にどう表すか UTF-8 : E3 81 82 (3 バイト) UTF-16LE : 42 30 (2 バイト) UTF-32LE : 42 30 00 00 (4 バイト)つまり、「UTF-8 と UTF-16 は同じ文字集合・同じ符号位置で、
バイト表現だけが違う」。
一方、Shift_JIS と Unicode は文字集合の段階から異なる
(Shift_JIS に無い文字は表せない)。
用語 層 例 文字集合 ① Unicode、JIS X 0208、ASCII 符号化文字集合 ①+② Unicode(符号位置つき) エンコーディング ③ UTF-8、UTF-16、Shift_JIS、EUC-JP コードページ ①〜③ CP932、CP65001(後述) 文字化けの原因を切り分ける際、
「③ の解釈ミス(バイト列を別の方式で読んだ)」なのか
「① の非対応(そもそも表せない文字)」なのかで
対処が全く異なるため、この区別が実務でも効く。
また、システム的には、上記の
- 文字集合
- コード番号、
- エンコーディング
をセットにしたコードページが存在する。
- コードページ - Wikipedia
http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%BC%E3%83%89%E3%83%9A%E3%83%BC%E3%82%B8
補足(Windows で頻出するコードページ): 番号で指定されるため、
主なものを控えておくと役に立つ。
番号 名称 備考 932 Shift_JIS(CP932) Windows の日本語既定。JIS とは微妙に異なる 20932 EUC-JP 50220/50222 ISO-2022-JP メールの JIS コード 65001 UTF-8 chcp 65001でコンソールを UTF-8 に1200 UTF-16LE Windows 内部の「Unicode」 1252 Windows-1252 西欧 「Shift_JIS」と「CP932」は厳密には別物である点が要注意。
CP932 は Shift_JIS に NEC 特殊文字・IBM 拡張文字を加えた
Microsoft の独自拡張で、
同じ文字に複数の符号位置がある(重複符号化)という問題を抱える。
これが「①〜③(丸数字)が文字化けする」等の原因になる。
補足(.NET でのコードページの扱い/最新化): .NET Core 以降、
既定で扱えるエンコーディングが大幅に減っている点は
移行時に必ず踏む落とし穴である。
.NET Framework .NET Core / .NET 既定のエンコーディング 多数(CP932 等を含む) UTF-8 / UTF-16 / ASCII 等のみ Encoding.GetEncoding("shift_jis")成功 例外(未登録) 既定の出力 環境依存 UTF-8(BOM なし) Shift_JIS 等を使うには、明示的に登録が必要である。
// NuGet: System.Text.Encoding.CodePages Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); var sjis = Encoding.GetEncoding("shift_jis"); // または 932**「.NET Core に移行したら CSV が読めなくなった」**という現象は、
ほぼこれが原因である
(.NET Coreへの移行)。なお、
Encoding.Defaultの意味も変わった。.NET Framework : OS の ANSI コードページ(日本語なら CP932) .NET Core 以降 : 常に UTF-8
Encoding.Defaultに依存したコードは、
移行時に静かに挙動が変わるため、
エンコーディングは常に明示するのが安全である。
補足(現在の指針): 新規開発では、
UTF-8 に統一するのが原則である。
場面 指針 ソース ファイル UTF-8(BOM は付けても付けなくても可) Web の出力 UTF-8( charset=utf-8)DB UTF-8(SQL Server なら NVARCHAR/_UTF8照合順序)ファイル入出力 UTF-8。ただし外部システムとの連携では相手に合わせる BOM 付けないのが現在の主流( new UTF8Encoding(false))// BOM なし UTF-8 で書き出す(.NET の既定は BOM を付ける版があるので注意) File.WriteAllText(path, text, new UTF8Encoding(false));Excel で開く CSV など、
BOM を付けないと文字化けする相手も残っているため、
用途に応じて判断する。
Tags: 移行, その他、開発の色々, .NET開発, 国際化対応, 文字コード
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。