知識マップ: Windows文字コード入門 - Linux連携で起きる文字化け

記事「Windows文字コード入門 - Linux連携で起きる文字化け」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

Windowsの文字化けは、CP932で保存したバイト列をUTF-8として読む、あるいはその逆というencodeとdecodeの前提のずれから生じ、方向によって崩れ方の症状が異なります。Windows PowerShellは5.1と7以降で既定のencodingが割れており、Out-FileがUTF-16LEを、Set-ContentがCP932を書くといった経路ごとの違いが事故の温床になります。Linux側はlocaleに従いUTF-8を前提に読むため、CP932やBOM付きUTF-8を渡すと文字化けやデータ破損につながり、WSLのように両者が同居する環境ではとくに起きやすくなります。元のバイト列が残っていればiconvやPowerShellで正しいencodingとして読み直し書き出すことで復旧できますが、誤読した内容を保存してしまうと復元できません。記事は新規ファイルをUTF-8第一候補にし、encoding自体をI/Oの契約として明文化する運用を推奨しています。

Windowsの文字化けとLinux連携の知識マップ同じバイト列をCP932とUTF-8のどちらで読むかで文字化けの症状が変わること、BOMやUTF-16LEやコンソールのコードページが独立した層であること、PowerShellのバージョンで既定のencodingが異なること、iconvやPowerShellによる復旧とUTF-8を第一候補にする運用方針の関係を示す図原因になり得る原因になり得る原因になり得る原因になり得る原因になり得る原因になり得る利用する利用する利用する軽減する軽減するで確認できる利用する利用する原因になり得る推奨される対応推奨される対応文字化けCP932UTF-8UTF-16LEBOM(Byte Order Mark)誤読内容の上書き保存によるデータ破損コンソールのコードページWindows PowerShell 5.1PowerShell 7iconvPowerShellLinuxのlocaleWSL(Windows Subsystem for Linux)encodingをI/O契約として明文化する運用新規ファイルをUTF-8第一候補にする運用方針

概念間の関係(全17件)

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

主要概念の定義

文字化け
実際のバイト列の解釈が意図したencodingとずれ、表示や内容が壊れて見える状態。
CP932
Windowsの日本語コードページ(コードページ番号932)。実務上はWindows版のShift_JISに近いが、他システムのShift_JIS実装と1バイトも違わない保証はない。
UTF-8
Unicodeの可変長エンコーディング方式。バイト列に強い制約があるため、CP932など他のエンコーディングのバイト列は厳密デコードで失敗しやすい。
UTF-16LE
Unicodeの符号点を2バイト単位のリトルエンディアンで表す文字コード。Windows APIやPowerShellの一部コマンドレットの既定出力に使われる。
BOM(Byte Order Mark)
ファイル先頭に置かれ、どのUnicodeエンコーディングかを示す数バイトの目印。UTF-8はEF BB BF、UTF-16 LEはFF FE、UTF-16 BEはFE FF。
コンソールのコードページ
cmd.exeなどコンソールの入出力に適用されるcode page。ファイル自体のencodingとは独立したレイヤー。
Windows PowerShell 5.1
Windowsに標準で同梱されている、.NET Framework上に構築されたレガシー世代のPowerShell(5.1系)のランタイム。実行ファイルはpowershell.exeで、.NETアプリからはMicrosoft.PowerShell.5.1.ReferenceAssembliesを介して呼び出せる。
PowerShell 7
PowerShell Core系譜の最新世代で、.NET(Core以降)上に構築されたPowerShellのエディション。実行ファイルはpwsh.exeで5.1のpowershell.exeとサイドバイサイドに共存し、Out-File・Set-Content・Export-Csvなどの既定書き込みencodingはBOMなしUTF-8である。
iconv
指定したencoding間でテキストのバイト列を変換するLinux/Unix系のコマンドラインツール。
PowerShell
オブジェクトパイプラインとエラー処理機構を持つ、Microsoftが最も堅牢で最新のWindows自動化に推奨するコマンドラインシェル兼スクリプト言語。
Linuxのlocale
言語・地域・文字コードの既定をまとめたLinuxの設定。多くはUTF-8をencodingとして含む。
WSL(Windows Subsystem for Linux)
Windows上でLinux環境を動かす仕組み。Windows側とLinux側の文字コードの前提が1台の中で同居する。
encodingをI/O契約として明文化する運用
CSVやログなどの受け渡しにおいて、encoding・BOM有無・改行コードを内容と同様に仕様として明記しておく運用方針。
新規ファイルをUTF-8第一候補にする運用方針
新規に作成するテキストファイルのencodingとして、まずUTF-8を第一候補として選ぶ運用方針。

機械可読データ

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