0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Windows11 zip圧縮 文字化け選手権

Last updated at Posted at 2025-02-09

動機と目的

ダウンロードしたzipファイルをAndroidで解凍したら文字化けした。
未だにこんなことあるのかとがっかりした。
実際にWindows11でzipファイルを作成して犯人探しをする。

実験手順

圧縮

ファイル名が日本語のファイルを作成した。
echo Hello world! > サンプル.txt

以下の環境と名前で計5つのzipファイルを作成した。

ArchLinux : zip サンプル.txt linux.zip

Windows11 標準機能 右クリック > 圧縮先... > ZIPファイル 7zip
utf8オフ win.zip win7z.zip
utf8オン u8win.zip u8win7z.zip

utf8オンとは以下の状態のこと。
u8.png

標準機能での圧縮については以下の記事を参照。

解凍

圧縮を行った5つの環境に加えて、以下の3つの環境でも解凍を行った。

  • iPadOS 18.3 @ iPad Air 5
    • Apple "ファイル"
    • Readdle "Documents"
  • Android 14 @ Pixel 7a
    • Google "Files"

結果

殆どの場合において文字化けすることなく解凍できた。
問題のあった組み合わせを以下に示す。

  • win7z.zip
    • Readdle "Documents"
      qunJ0ipH.jpg

    • Google "Files"
      JoYZDrCd.jpg

linuxで解凍した様子を以下に示す。
問題こそ起きなかったがu8win7z.zipでは何故かASCIIで読んでいるようだ。

[root@toko-aero linux]# unzip linux.zip -d linux
Archive:  linux.zip
 extracting: linux/サンプル.txt  
[root@toko-aero linux]# unzip u8win.zip -d u8win 
Archive:  u8win.zip
  inflating: u8win/サンプル.txt  
[root@toko-aero linux]# unzip u8win7z.zip -d u8win7z
Archive:  u8win7z.zip
サンプル.txt:  mismatching "local" filename (уВ╡уГ│уГЧуГл.txt),
         continuing with "central" filename version
 extracting: u8win7z/サンプル.txt  
[root@toko-aero linux]# unzip win.zip -d win
Archive:  win.zip
  inflating: win/サンプル.txt    
[root@toko-aero linux]# unzip win7z.zip -d win7z
Archive:  win7z.zip
 extracting: win7z/サンプル.txt

imhexで覗く

文字化けに深く関わってくるのがGeneralPurposeFlagUTF8フラグとファイル名のエンコード方法である。

↓UTF8フラグの立っている状態
0.png

↓ファイル名がutf-8でエンコードされている状態
1.png

以下実際のファイルである。

linux.zip
6.png

u8win.zip
2.png

u8win7z.zip
3.png

win.zip
4.png

win7z.zip
5.png

Windows11標準機能で圧縮した2つは同一のバイナリであった。

注目すべきはやはりwin7z.zipである。
UTF8ビットが立っていないのも、sjisエンコードされているのも、このファイルのみである。

拡張領域にタグ0x75 0x70としてutf-8エンコードされたファイル名が書かれていることが確認できる。

https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT 4.6.1より抜粋

4.6 Third Party Mappings

4.6.1 Third party mappings commonly used are:

0x07c8 Macintosh
...
0x6854 THEOS
0x7075 Info-ZIP Unicode Path Extra Field ←これ
0x7441 AtheOS/Syllable
...

追加実験

win7z.zipの拡張領域を消してみる

utf-8エンコードされたファイル名の存在する拡張領域2箇所を00で埋めた。
これで予告無しにsjisエンコードされたファイル名を突きつけるzipファイルが出来上がった。
ArchLinux上のunzipコマンドで解凍した。
image.png

 zip % unzip mod.zip
Archive:  mod.zip
 extracting: ГTГУГvГЛ.txt 

化けた。

至って真っ当な結果である。

まとめ

文字化け選手権、選ばれたのは...

... 7zip でした...

  • sjisでファイル名を吐く
  • ロケール設定で挙動が変わる
    • utf8にしていても問題が起きる

オプションcu=onを指定すればutf8エンコードのファイルを吐くようだが、知らないと使えないので意味をなさない。
筆者然り、何も知らずにとりあえず7zipで圧縮している人は多いだろう。
文句は言わないのでArchLinux、今すぐインストール。

使うべきは...

... Windows11標準機能 でした...

  • インストール不要
  • utf-8エンコードしてくれる
  • 変なロケール設定に惑わされない
  • 中身が小さくても律儀にdeflateする
    • かわいい
    • 実用上の問題はない

知っておこう

今日は、ファイル名がshift-jisでエンコードされたzipファイルが文字化けしない理由について、知っておこう。

( "Documents" で解凍する )
う〜ん、化けたね!、じゃ!

答: 拡張領域にutf8でエンコードされたファイル名があるから

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?