文字コードについて、Shift-JISもカオスながら、鳴り物入りで出来たUnicodeも色々あるようなので、要点をサクッとまとめ。
とりあえずこれだけ押さえておけばOK
- Unicode:文字コードの規格の名称。あらゆる国の文字コードを格納できる
- UCS-4:Unicodeとほぼ互換
- UCS-2:UCS-4の一部分。65,535文字を表現
- UTF:UCS-4(UCS-2)、Unicodeをバイト列で表現する方法。Unicodeでは "Unicode Transformation Format"、ISO/IEC 10646では "UCS Transformation Format"の略
- BOM (Byte Order Mark):この文書がビッグエンディアンかリトルエンディアンかを示すファイル先頭に付ける数バイトのマーク。「ボム」と読むみたい
- UTF-8:1~4バイトの可変長で、先頭1~5ビットがバイト数を示す。ビッグエンディアン一択らしいのでBOMは付けないのが普通だが、BOMを付けても良い事になっている
- UTF-16:2または4バイトの可変長。BOM無しはビッグエンディアン、BOMで指定があればそれに従う
- UTF-32:4バイトの固定長
基本的には、UTF-8かUTF-16で全言語まかなえる。UTF-32は固定長がありがたい環境向け。
UTF-8は、ASCIIコード付近のバイト数が少なく、英字が多いなら総バイト数が小さくなる。
UTF-16は、日本語が3バイトらしく、日本語が多いなら総バイト数が小さくなる。
呼び方の変種や亜種的なもの
UTF-8N:後述
UTF-16LE:UTF-16のリトルエンディアンのこと
UTF-16BE:UTF-16のビッグエンディアンのこと
UTF-7:UTF-16をBASE64エンコード。メール関係の互換用らしい?
ISO/IEC 10646:Unicodeのほぼ互換規格だが、文字範囲が広いため、この規格をUTF-8で表現すると最大6バイトになる
UTF-8 mb4:MySQLは、UTF-8は3バイトまでの対応だったらしく、4バイト対応を明記したもの
CESU8:UTF-8の亜種。Oracle独自
ちなみにMicrosoftは、以前(Win10 1903あたり?)まで以下のように表記していた模様。
・「UTF-8(BOM有り)」の事を「UTF-8」
・「UTF-8(BOM無し)」の事を「UTF-8N」
・「UTF-16LE」の事を「Unicode」
・「UTF-16BE」の事を「Unicode big endian」
・「BOM」の事を「シグネチャ」
Web系以外でも、UTF-8、UTF-16LE辺りは、触れる機会多いのではないかと。
それぞれのプラットフォームでの標準
Windows:UTF-8 (BOM有り)、PowerShellは UTF-16LE
Linux:UTF-8 (BOM無し)
Mac:UTF-8 (BOM無し)
あとついでに、改行コードにも注意です。
Windows:CR+LF
Linux:LF
Mac:CR
Linuxのシェルスクリプトで、CRLFのファイルを実行しようとすると、行末に^M
って文字が入ってエラーが出たり、予期せぬバグの元になります。