文字化け騒動の正体-時代も変わったものである

文字化け騒動がよく起こるので、ちょっと調べてみたら、幽霊の正体見たり枯れ尾花、である。
  1. 単にメモ帳を起動する。
  2. 白紙の画面が出る。
  3. そこで何か文字を書く。
  4. 適当な名前を付けてファイルを保存する。
その時の文字コードが今はデフォルトでは UTF-8N になっている。BOMなしのUTF-8である。
これは先にあった「Windows 10 Ver.1903」へのUpdateによるものである。これより前にはこんなことはなかった。



メモ帳といえば「ANSI(Shift_JIS)のCRLF改行」というのがWindows 3.0から続いていた。それ以来そのことが私の脳細胞に染み付いてきた。途中、Unicodeなどの文字コードが使用できるように追加されてきたが、デフォルトではANSI(Shift_JIS)だった。それで、新規にメモ帳でShift_JISのファイルを作ったと思っていたら、実際はUTF-8Nだった。それでメモ帳での文字化けが頻繁に起こったわけである。

その点からいえば、これはコペルニクス的転回である。しかし、これで特殊日本的なShift_JISから世界標準的なUTF-8へと変わったわけで、この点では喜ぶべきかもしれない。

しかし、これによってこれから*.htmlファイルをANSI(Shift_JIS)で書くべきか、それともUTF-8にするべきか、考えてしまうところである。Shift_JISで書いた膨大な量のテキストがある。この現実は重い。いまさら急に全部変更することは困難である。

また、UTF-8に変更した場合、そこから呼び出すPerl/CGIやPHPとの相性はどうなのか。これも問題である。この点での動作が確認できるまでは、ホイホイとはこの「メモ帳 UTF-8N」に乗っていくことはできない(だろう)。

重要
メモ帳のデフォルトの文字コードはUTF-8N/CRLF改行である。
新規に作成する場合には要注意である。

そのデフォルトで作成したテキストは、コマンドプロンプトのtypeコマンドで表示することはできない。typeコマンドはANSI(Shift_JIS)だけのようである。これはコマンドプロンプトのコードページがShift_JISになっているからである。

1
type_utf8.exeはUTF-8またはUTF-8Nのテキストを画面表示する。



type_utf8.exe(spc_0027)
type_utf8.cpp(ccp_0331)


2
typeコマンドはANSI(Shift_JIS)だけのようである。
これはコマンドプロンプトのコードページがShift_JISになっているからである。


重要
この種の文字化けの簡単な修正方法。
(1)メモ帳で文字コードの指定(meta charset)の部分をutf-8にして保存する。
(2)メモ帳で同名のファイル名にしてANSIで「名前を付けて保存」する。

メモ帳で作成・編集する場合デフォルトでは「UTF-8N/CRLF」になることに注意。
なお、半角英数字ばかりのテキストでは「ANSI」を指定して保存しても「UTF-8」になる。何か日本語を入れないと「Shift_JIS」にはならない。
Microsoftの自己満足的なUpdateによるメモ帳の改悪またはバグである。

- 2019/08/25 -


文字化け騒動

*.htmlファイルは通常はメモ帳でShift_JISで書いている。大して意味はないが昔からの習慣でそうなっている。

そういうことにしていると、たまに不可解な現象に出会って、悩んでしまうようなハメに陥る。それが次のような例である。
これはかなり昔に作ったファイルである。作成時の細かいことは今はまったく記憶にない。それで悩むわけである。


元のファイルをいつものようにメモ帳で見て確認する。
メニューの「ファイル(F)」-「メモ帳で編集(D)」で読み込んで表示する。
確かに文字コードの指定は「shift_jis」になっている。
文字化けもしていない。


ブラウザの「表示(V)」-「エンコード(D)」も「シフトJIS」になっている。
どこも別に問題はないように見える。


しかし、実際にブラウザで見ると上のように文字化けしている。これはナゼなのか。それにしばし悩んでしまう。
あれこれやっていると、この原因は実に単純なところにあったことがわかった。
「メモ帳でShift_JISで書く」ことが長く続くと、自分の内部で「メモ帳=Shift_JIS」という思い込みができてしまう。たしかに、昔のメモ帳ならそうだった。

しかし、今のメモ帳はそれ以外の文字コードでも読み書きができる(下図)。このことをすっかり忘れてしまっていたのである。
とはいえ、実際はShift_JISとUnicode系(UTF-***)だけであるが。ちなみにANSIが日本語ではShift_JISに当たると考えてよい。


メモ
ANSI
<meta charset="shift_jis">

UTF-8
<meta charset="utf-8">


原因はどこにあったか
これを思い出すと、この得体のしれない「文字化け騒動」の原因がわかってきた。
実は、このtools.htmlというファイルはUTF-8N(BOMのないUTF-8)で書かれていたのである。
しかし、そんなことはもう昔のことで今では覚えていない。ファイルの整理のために見直してこういうことがわかっただけである。
なお、メモ帳の表記では「UTF-8N」は「UTF-8」に、いわゆる「UTF-8」は「UTF-8 (BOM付き)」になる。


これでは文字化けするのも当然である。

それをブラウザで「<meta charset="shift_jis">」として、Shift_JISとして表示させようとしたので文字化けになったわけである。

ちなみに、現在では*.htmlをUTF-8で書いた場合は という目印を最初のほうに埋め込んでいる。しかし、この文字コードはCGI/PHPのプログラムでは使わない。それが盲点(これ差別語かも)になったようである。

重要
メモ帳で読み書きできているからといってShift_JISとは限らない。
Unicodeかもしれないし、*.htmlではUTF-8かもしれない。

半角英数字だけで書かれたテキストでは、この相違はメモ帳だけでは区別できない。ASCII文字に関してはShift_JISもUTF-8も同じである。そこに日本語が入ったときにブラウザで文字化けするかどうかでわかることになる。「meta charset="shift_jis"」となっていてもUTF-8で書き込まれるので文字化けになる。

*.htmlファイルで、
<meta charset="shift_jis">
となっているので、SJISのつもりで書いたところ、文字化けするのは、そのテキストがUTF-8Nで書かれていたからである。


CGI/PHPはEUC-JPで書いている。この場合の原則は以下のようになる。
  1. HTMLがShift_JISの場合
    受け取ったパラメーターをプログラム内でEUC-JPに変換する必要が生じる。
  2. HTMLがEUC-JPの場合
    EUC-JPで書かれたコンテンツから送出されるデータはEUC-JPであるから文字コードの変換は不要。
  3. CGI/PHPの中でフォームを作っている場合
    EUC-JPで書かれたコンテンツ内にあるから文字コードの変換は不要。これはほとんど問題は生じない。
CGI/PHPと関連するファイル名はペアになったCGI/PHPと同名で拡張子だけを*.htmlにする。
  1. EUC-JPで書いた*.htmlには末尾に「_e」を付ける。引数の文字コードの変換は不要である。
  2. UTF-8で書いた*.htmlには末尾に「_u」を付ける。これはメモ帳で読み書きできるので文字コードの判別が面倒だからである。
    しかし、CGI/PHPに関して言えばそれに関係した*.htmlをUTF-8で書く必要性はまったくない。
  3. それらがない場合はShift_JISである。内部で文字コードをEUC-JPにする必要が生じる。
- 2019/08/17 -