はじめに
文字コードに関する知識が浅いため纏める。
データが送られる仕組み
データを送信し受信する例を例に説明する。
①「すき」という文字を受信側に送信したいとする。その時、「すき」を文字コードに従ってバイナリデータに符号化(エンコード)する。
「す」→100000101010111
「き」→100000101010110
②エンコードされたバイナリデータを受信側に送信する。
③送信されたバイナリデータを受信する。受信したデータを受信側の文字コードに従って復号化(デコード)する。
この時、送信側で設定された文字コードと受信側で設定された文字コードが食い違っていると、受信側で復号化に失敗して文字化けが起きてしまう。
WIndowsOSの文字コードについて
Windows OS内部で使用する文字コードはUnicodeであり、符号化方式(エンコーディング)はUTF-16である。
これだけ書くと、とても単純な話なのですが、ネット上で、
「日本語化したWindowsの文字コードはShift_JISである」
と堂々と記載されていることがあり、非常に迷いました。
また、某AIに以下のように質問すると
質問
日本語化したWindowsOSの文字コードはなんですか?
回答
日本語化したWindowsOSでは、一般的にはShift JIS (Shift Japanese Industrial Standards) が使用されています。Shift JISは、日本語の文字セットを表現するために広く使われる文字コードの一つです。
と回答が返ってきます。
上記は質問の仕方があまり良くなく、回答にしても間違いではないのかもしれません。Shift JISも扱えます。
しかし、Windowsの、システムとしての文字コードは Unicode であり、符号化方式 (エンコーディング) は UTF-16(2回目)
というのが正確な情報です。
Unicodeをサポートしないアプリケーションではシステムロケールで設定された文字コードおよび符号化方式への変換処理が行われる。
なお、
Unicode をサポートしないアプリケーションやライブラリを動作させる際に限り、UTF-16からシステム ロケールで設定された文字コードおよび符号化方式への変換処理
が行われるようです。これは、「コマンドプロンプト」などがよい例だと思います。
日本語化したWindows(システムロケールが日本)のコマンドプロンプトはデフォルトではShift-JISでの入出力対応になっています。
Unicode対応でないプログラムについて(システムロケールについて)
システムロケールはUnicodeではないプログラム(ANSI)で使用する既定の言語を指定する。日本語化したWindows(システムロケールが日本)のコマンドプロンプトはデフォルトではShift-JISでの入出力対応になっている。
SystemLocale は、Unicode 対応でないプログラムで使用する既定の言語を指定します。
この設定は、Windows セットアップと Windows 展開サービスの両方で使用されます。
システム ロケールは、既定でシステムが使用するビットマップ フォントとコード ページ (ANSI または DOS) を指定します。 システム ロケール設定は、ANSI (Unicode 対応でない) アプリケーションのみに影響します。 Unicode 対応でないプログラムの言語は、システムごとの設定です。
ユーザーは、コントロール パネルの地域と言語の項目で [管理] タブを使用して、システム ロケールを変更できます。
ANSIとShift_JISの違い
日本語WindowsではShift_JISのことをANSIと呼ぶ。
ANSIは"American National Standards Institute"の略称である。
メモ帳における”ANSI”は、その言語・地域における標準規格のことであり、日本語Windowsの場合はShiftJIS(CP932)のこと、ほかの言語のWindowsでは別の文字コードを指す。
つまり、文字コードを直接指している訳ではない。日本で言うJIS(日本工業規格)を制定している日本産業標準調査会に相当する組織の事である。
実質的に国際標準となっている規格の多くを制定している組織である。
古くから用いられている規格としてASCIIがあるが、これもANSIが制定したものである。
ではWindowsにおける「メモ帳」の"ANSI"はASCIIなのか?と言うと、日本語を扱えている時点でそうではない。
メモ帳における"ANSI"は、その言語・地域における標準規格の事を指しているようである。
日本であれば、Shift_JIS (CP932)の事を指すのだが、他の言語のWindowsでは別の文字コードを指している。