知識マップ: Windowsの文字コードと改行コード - 文字化けとCRLF/LFの基本

記事「Windowsの文字コードと改行コード - 文字化けとCRLF/LFの基本」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

Windowsのテキストはバイト列・文字コード・改行コード・BOMという別々の軸の組み合わせで成り立ち、UTF-8やUTF-16LEはUnicodeの符号点をバイト列にする文字コードである一方、CP932は日本語Windows独自のレガシーコードページで両者は前提を取り違えると文字化けを起こす。BOMはUTF-16のバイト順を示す目印であると同時に、UTF-8では「UTF-8である」というシグネチャとして使われ、Windows PowerShell 5.1は非ASCII文字を含むスクリプトを正しく読むためにBOMを必要とする。改行コードはCRLFとLFのどちらかで文字コードとは別問題であり、リポジトリ単位の扱いは.gitattributesで固定できるが、Gitは改行こそ変換しても文字コードは自動で正してくれない。文字化けは正しい文字コードで開き直せば戻ることが多いが、誤読した内容をそのまま保存すると元のバイト列が失われ、表示崩れではなく取り返しのつかないデータ破損になる。

Windowsの文字コードと改行コードの知識マップUnicodeとUTF-8・UTF-16LE・CP932の関係、BOMの役割、文字化けとデータ破損の違い、PowerShellの既定値やGitの改行変換が改行コードと文字コードそれぞれにどう効くかを示す図。利用する利用する利用する利用する利用する利用する原因になり得る実装を担う実装を担う両立しない原因になり得る両立しない両立しない利用する利用する利用する前提とするで構成できる原因になり得る文字コード(キャラクターエンコーディング)改行コードUnicodeUTF-8UTF-16LECP932アクティブコードページ(ANSI/ACP)BOM(Byte Order Mark)文字化けPowerShellの文字コード既定値.gitattributes誤読内容の再保存によるデータ破損

概念間の関係(全19件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

文字コード(キャラクターエンコーディング)
文字列をバイト列として保存・伝送するための対応規則。Unicodeのような文字集合をどうバイト列にするかを定めるUTF-8やUTF-16、Windows独自のCP932のようなレガシーコードページなどが含まれる。
改行コード
行の区切りに使うバイト列。WindowsではCRLF(0D 0A)が伝統的で、Linux/macOSではLF(0A)が一般的。文字コードとは別の軸で決まり、同じ文字コードのファイルでも改行だけがCRLFとLFの間でずれることがある。
UTF-8
Unicodeの可変長エンコーディング方式。バイト列に強い制約があるため、CP932など他のエンコーディングのバイト列は厳密デコードで失敗しやすい。
UTF-16LE
Unicodeの符号点を2バイト単位のリトルエンディアンで表す文字コード。Windows APIやPowerShellの一部コマンドレットの既定出力に使われる。
CP932
Windowsの日本語コードページ(コードページ番号932)。実務上はWindows版のShift_JISに近いが、他システムのShift_JIS実装と1バイトも違わない保証はない。
アクティブコードページ(ANSI/ACP)
Windowsの「ANSI」という表記が多くの場合指す、そのマシンに設定されている既定のコードページ。日本語環境では通常CP932になる。
BOM(Byte Order Mark)
ファイル先頭に置かれ、どのUnicodeエンコーディングかを示す数バイトの目印。UTF-8はEF BB BF、UTF-16 LEはFF FE、UTF-16 BEはFE FF。
PowerShellの文字コード既定値
PowerShellのコマンドレットが読み書きに使う既定の文字コード。PowerShell 6以降はutf8NoBOMに統一されている一方、Windows PowerShell 5.1はコマンドレットごとに既定がそろっていない。
文字化け
実際のバイト列の解釈が意図したencodingとずれ、表示や内容が壊れて見える状態。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。