最新Windowsでのファイル名の文字コードの扱いに注意

最新のWindowsであるWindows(Windows 10 21H2含む)環境では、文字コードの扱いが変わっていることに注意しておいた方が良い。

新規に日本語版としてWindows 11をインストールすると、ディレクトリやファイル名までUTF-8になる。
それが何に災いするかというと、Zipなどに圧縮する場合など、別なシステムに受け渡す場合に文字化けしてしまう懸念がある。

「設定」→「時刻と言語」→「管理用の言語設定」と開くと、

以下のような「地域」設定が開く。

通常は、以下のように、「現在のシステムロケール」は「日本語」が選択されているはずだが、
この下の「ベータ:ワールドワイド言語サポートでUnicode UTF-8を使用(U)」の設定によってファイルシステム全体をUnicode UTF-8にするかが変わる。

ここにチェックを入れてシステムを再起動すると、ファイルやフォルダ、システム内で取り扱う文字コードがすべてUTF-8となる。

自分だけで使用している分には特に問題になることはほとんどないが、この状態でファイル圧縮ソフトを使ってファイルを圧縮した場合、UTF-8で保存されてしまうことになる。

ところが、上記スイッチに「ベータ」とあるように、日本国内で使用されているWindows機はほとんどがまだShift-JISなのである。

UTF-8のファイル名で保存されたZIPファイルをメールなどで送付すると、受信して解凍するときにこれに対応していないことが多いため、文字化けしてしまうことになる。

これをどう受け止めるか、だが本来はすべてUTF-8にするべきではあるため、受信相手にUTF-8であることを伝えてUTF-8で解凍してもらうべきとは思うがそこまで強要するのもどうかと思う。

Windows 7からWindows 10にアップグレードして、それをさらにWindows 11にアップグレードしている場合など、まだまだファイルシステムにShift-JISを使用しているPCが大多数なのは事実である。

コメント

  1. >新規に日本語版としてWindows 11をインストールすると、ディレクトリやファイル名までUTF-8になる。

    なる場合もあるでしょうが、限定的です。

    ➀OSが内部で使用する文字コード。
    ②ファイルシステムが使用する文字コード。
    ③プログラムが内部で使用する文字コード。
    ④プログラムが入出力で使用する文字コード。

    これらは同じである必要はありません。適切にコード変換が出来れば異なっていても構いません。

    ➀NT系のWindowsが内部で使用するのはUnicode(エンコード方式はUTF-16)です。以下UTF-16と記述します。

    ②MS-DOS/PC-DOSの時代から使用されてきたFATファイルシステム(以下FAT)はシステムロケールデフォルトのコードページ(文字コード)が使用されます。メモ帳でANSIと表記されるコードページです。システムロケールが日本語(日本)の場合は、CP(コードページ)932が使用されます。CP932はShift_JISとほぼ同じです。ただしexFATではUTF-16が使用されます。
    NTフィルシステム(NTFS)ではUTF-16が使用されます。ワールドワイド言語サポートでUnicode UTF-8を使用(U)にチェックを付けた場合、変わるのはFATで使用する文字コードです。影響するのはフロッピーディスクか、容量の小さいフラッシュメモリー媒体です。

    ③WindowsAPIはシステムロケールデフォルトのコードページを使う物とUTF-16を使う物があります。最近のプログラムはUTF-16を使用する物が多いので影響するのは昔からあってバージョンアップしていまも使われている古いプログラムです。

    ④メモ帳で言えば入出力の文字コードをANSIにしていれば出力ファイルの内容に影響します。Unicodeを使っていれば変わりません。

  2. ZIPアーカイバーが使用する圧縮形式はMS-DOS/PC-DOSの時代のPKZIPが使用していたものが元になっています。この時代には書庫に格納するファイル名の文字コードはIBM コードページ 437 が使用されていました。Unicodeが普及してくるとファイル名をUnicodeで格納できるように仕様が拡張されました。エンコード方式はUTF-8が使用されます。
    Windows上のZIPアーカイバーはまだUnicodeに対応していない物があるので、そういうZIPアーカイバーは、ワールドワイド言語サポートでUnicode UTF-8を使用(U)にチェックを付けるとファイル名をUTF-8で格納するようになると思います。UTF-8で格納されるのならUTF-8で展開できるZIPアーカイバーを使えば良いはずなのですが、UTF-8で格納した場合はUTF-8で格納したことを示すフラグをヘッダーに書き込む必要があり、これが書き込まれていないとUTF-8だと判別してくれずにファイル名が文字化けしてしまいます。Explzhのようにファイル名の文字コードを自動判別して展開してくれるZIPアーカイバーを使用すれば回避できます。

  3. Shift-JISという表記について。

    Shift_JISは元々は16ビットPC用日本語OS(日本語CP/M-86)の内部コードとして作られました。最初は公的な規格として作られたものではなかったのです。
    SJIS、Shift-JIS、Shift JISなど多様な表記があるのは元々正式名称があった訳ではないからでしょう。
    だからShift-JISでもShift_JISでもどちらでもOKといえばOKなのです。
    MS-DOS/PC-DOSの日本語版に採用されたため広く普及し、後付けでJIS X 0208に「シフト符号化表現」という名称で取り込まれました。だから正式には「シフト符号化表現」と書くべきなのでしょうが、誰も「シフト符号化表現」なんて使いませんよね。

    HTMLでcharactersetを指定する場合はIANAの規定であるShift_JISとしなくてはいけません。Shift-JISでは誤りです。だからHTML以外でもShift-JISではなくShift_JISと書いておくのが妥当だと思います。

    • らうたんさん、
      勉強になります。
      今後はShift_JISと書くよう気を付けます。
      コメントありがとうございます。

タイトルとURLをコピーしました