[3] 
[[ファイル名]]における[[文字]]の取り扱いは難しい問題です。


* 文字コード

[18] [[ファイル名]]が[[文字列]]なのか[[バイト列]]なのか[[問題][文字としてのバイト]]があります。

[20] 
表示と安全性については[[識別子文字]]、[[ファイル名安全]]も参照。

* 文字の制限


[4] 
多くのファイル・システムやその実装では、その環境で使える文字の全てかファイル名に使えるわけではない。例えば、 [[FAT]] や [[NTFS]] ではディレクトリ (フォルダ) 区切子として使われる [CODE(file)[\]] を名前に使うことが出来ない。

[1] [[特別なファイル名]]も参照。

* 大文字と小文字

[5] 
[DFN[ファイル名における大文字と小文字]]の取り扱いは、
[[プラットフォーム]]と[[ファイルシステム]]に依存する複雑な問題です。

[6] 
[[大文字と小文字]]の違いは、単にその[[プラットフォーム]]内部だけの問題に留まりません。
例えば[[大文字と小文字]]を区別しない[[プラットフォーム]]で作られた [[HTML文書]]中の[[相対URL]]
に[[大文字と小文字]]の違いを気にしないで[[ファイル名]]を書くと、
区別される[[プラットフォーム]]に移動したときに[[リンク]]が機能しなくなります。

[7] 
[[比較]] ([[ファイル]]の参照や[[ファイル名]]の衝突の判定)
において[[大文字と小文字]]を区別するかという問題と、
[[ファイル名]]が[[大文字と小文字]]を[[正規化]]した状態で保存されるかという問題があります。

[8] 
その他に比較的軽微な問題として、
[[大文字と小文字]]のみ異なる[[改名]]が可能かどうか、
[[整列]]でどう扱われるかなどの問題もあります。

[9] 
当該[[ファイルシステム]]でどのような[[文字コード]]を使うかにより、
[[大文字と小文字]]の変換や同一視が行われる[[文字集合]]の範囲も変わってきます。
[[ロケール]]等で異なる[[大文字と小文字]]の扱いや、
[[Unicodeの版]]による違いを[[ファイルシステム]]や[[プラットフォーム]]の [[API]]
でどう扱うかも問題になってきます。

[10] 
[[ファイルシステム]]をまたがる移動、
[[書庫ファイル]]や[[ネットワーク]]による転送などで、
取り扱いの違いが問題となることがあります。

[EG[

[11] 
例えば[[ファイル名]]をすべて[[大文字]]に置き換える必要が生じたり、
2つの[[ファイル]]の[[ファイル名]]が衝突するので保存できなかったりします。

]EG]

[12] 
[[ファイルシステム]]によっては[[長いファイル名]]と[[短いファイル名]]のような異なる[[ファイル名]]を1つの[[ファイル]]に与えることが出来る場合がありますが、
[[ファイル名]]ごとに適用される規則が違うことがあります。

;; [36] [[識別子文字]]も参照。

-*-*-

[21] 
[[ISO 9660]] では[[大文字]]と[[小文字]]を区別しません。

[23] 
[[OpenVMS]] の [[ODS-2]],
[[NetWare]] の [[NSS]], [[NWFS]] も区別しないとのこと。

[22] 
[[APFS]] は[[大文字]]と[[小文字]]を区別しないモード (既定値)
と区別するモードがあります。

[24] 
[[OpenVMS]] の [[ODS-5]] も両モードあって区別しないのが既定値とのこと。

[25] 
[[HFS+]] の既定値は不区別、 [[case-preserving]] で、区別するモードもある。

[31] 
[[NTFS]] は不区別、 [[case-preserving]] で、[[フォルダー]]単位で区別させることもできる。
[SRC[>>30]]

[33] 
[[ext4]] は区別しますが、[[ディレクトリー]]単位で区別させないこともできます。
[SRC[>>32]]


[19] [CITE@ja[ファイルシステムと大文字小文字 #case-sensitive - Qiita]], [TIME[2024-07-13T08:56:28.000Z]] <https://qiita.com/jokester/items/f8a106832af2d3eb3436>

[REFS[

- [30] [CITE@ja[ASCII.jp:Windows 10 RS5で改良されたファイル名の大文字/小文字の区別 (1/2)]], [[ASCII]], [TIME[2024-07-13T09:10:46.000Z]] <https://ascii.jp/elem/000/001/786/1786156/>
- [32] 
[CITE@ja[fast23-basu.pdf]], [TIME[2024-07-13T09:15:00.000Z]] <https://www.usenix.org/system/files/fast23-basu.pdf>



]REFS]

[42] 
[CITE@en[Using the Linux kernel's Case-insensitive feature in Ext4]], [TIME[2024-07-13T09:23:43.000Z]] <https://www.collabora.com/news-and-blog/blog/2020/08/27/using-the-linux-kernel-case-insensitive-feature-in-ext4/>



[29] 
[[FAT]] など古くからある[[ファイルシステム]]では[[ASCII大文字・小文字不区別]]。

[27] 
[[NTFS]] は[[初期化]]時に作られる [CODE[$UpCase]] ファイルで[[大文字と小文字]]の関係を決めている。
[[初期化]]に使った[[プラットフォーム]]が持っている対応表が反映される。
[SRC[>>28, >>26]]

[REFS[

- [28] [CITE@en[$UpCase (10) - File - NTFS Documentation]], [TIME[2022-06-12T19:25:54.000Z]], [TIME[2024-07-13T09:07:53.509Z]] <https://flatcap.github.io/linux-ntfs/ntfs/files/upcase.html>
- [26] [CITE@ja[グルジア文字と case insensitive filesystem - 彷徨えるフジワラ]], [TIME[2024-07-13T09:06:20.000Z]] <https://flying-foozy.hatenablog.com/entry/20120101/1325384327>

]REFS]

[44] 
[CITE@ja[トルコ文字と case insensitive filesystem - 彷徨えるフジワラ]], [TIME[2024-07-13T09:28:49.000Z]] <https://flying-foozy.hatenablog.com/entry/20120102/1325473117>


[43] 
[CITE@en[Internationalization for the NFSv4 Protocols]], [[David Noveck]], [TIME[2023-11-20T13:13:48.000Z]], [TIME[2024-07-13T09:25:12.609Z]] <https://www.ietf.org/archive/id/draft-ietf-nfsv4-internationalization-07.html#section-6.3>




* 正規化

;; [37] [[識別子文字]]も参照。

[38] [[Unicode正規化]]は破壊的処理なので要注意です。

[39] [[HFS+]] はデータ破壊を避けるために独自の手法を使っています。
[SEE[ [[HFS+のNFD]] ]]


[40] 
>>34 >>35 は [[NFC]] と [[full case folding]] を採用しています。

[41] >>40 本当に実装されているのかは謎。まあこれはファイルの要件なので、
意図的にそういうファイルを作ろうとしなければ自然に満たせる、か?


- [34] 
[CITE@en[Case folding of the file names · Issue #1631 · w3c/epub-specs · GitHub]], [TIME[2024-07-13T09:18:37.000Z]] <https://github.com/w3c/epub-specs/issues/1631>
- [35] [CITE@en[Require Unicode full case folding and NFC normalization by mattgarrish · Pull Request #1648 · w3c/epub-specs · GitHub]], [TIME[2024-07-13T09:19:25.000Z]] <https://github.com/w3c/epub-specs/pull/1648/files>


[45] [CITE@ja[case の insensitive と preserve - 彷徨えるフジワラ]], [TIME[2024-07-13T09:29:36.000Z]] <https://flying-foozy.hatenablog.com/entry/20120104/1325657430>

* プラットフォームとファイルシステムの事情

** MIME ファイル名

[2] [CODE[filename=""]] も参照。

** ZIP ファイル

[160] 
[[ZIPファイル]]では歴史的に様々な[[文字コード]]が使われてきました。
他の分野と比較しても [[UTF-8]] の普及が遅く、現在も [[UTF-8]]
と旧来の[[文字コード]]が混在して使われ続けています。

[161] 
[[ZIPファイル]]で[[文字コード]]が問題となる箇所は、

- [162] [[ファイル名]]
- [163] [[ファイル]]の[[注釈]]
- [164] [RUBY[[[合言葉]]][パスワード]]
- [344] [[ZIPファイル]]全体の[[注釈]]
- [165] その他の[[応用]]依存の[[メタデータ]]

です。

;;
[166] 
この他に[[ファイル]]の[[内容]]にも当然のことながら[[文字コード]]に依存したデータ
(= [[テキストファイル]]) が含まれる可能性はありますが、 [[ZIPファイル]]には
(少なくても標準的には) [[ファイル]]の内容の[[文字コード]]を記述する方法
([[MIME]] の [CODE[Content-Type]] [CODE[charset]] に相当するもの)
がありません。「[[ZIPファイル]]の処理」の範疇では、
[[ZIPファイル]]に含まれる[[ファイル]]の内容は[[バイト列]]として扱われるだけであり、
その[[文字コード]]が問題となることはありません。

[167] 
[[ZIP]] には「[[ZIPファイル]]全体の[[文字コード]]」のような概念はありません。

[168] 
格納される各[[ファイル]]に[[ファイル名]]があり、それは何らかの[[文字コード]]で記述されています。

[169] 
[[注釈]]や[[合言葉]]も[[文字コード]]が関係してきますが、
あまり問題とされることは少ないようで、[[ファイル名]]が [[ZIPファイル]]における[[文字コード]]の主要な問題領域となっています。

[299] 
[[合言葉]]は [[AES]] 暗号化方式と [[ZipCrypto]] の2種類の[[暗号化]]方式に関係しますが、
前者では [[UTF-8]] 固定であるのに対し、後者は[[実装依存]]であり、
現実的に考えて[[ファイル名]]と同じ[[文字コード]]が使われていると考えられます。
従って[[ファイル名の文字コード]]が[[判定][文字コードの判定]]できれば、
それを使って[[合言葉]]の試行ができます。

*** 変遷の概略

[170] 
[[ZIP]] は元々[[米国]]で [[DOS]] 向けの製品として開発されました。そのため、
現在の [[ZIP]] 仕様書にも

> D.1 The ZIP format has historically supported only the original IBM PC character [BR[]]
encoding set, commonly referred to as IBM Code Page 437.  This limits storing [BR[]]
file name characters to only those within the original MS-DOS range of values [BR[]]
and does not properly support file names in other character encodings, or [BR[]]
languages. [SNIP[]]

と説明されています [SRC[>>159]]。
つまり [[CP437]] が [[ZIP]] の本来の[[文字コード]]であるとされます。
[[CP437]] は[[米国]]市場等の [[MS-DOS]] で使われていた[[コードページ]]です。


[53] 
程なくして [[ZIP]] は[[米国]]以外の諸国の [[DOS]] でも使われるようになりました。
[[米国]]版もその他の版も、おそらく[[文字コード]]の変換は一切なく、
[[プラットフォーム]]の[[ファイル名]]をそのまま格納したり、
逆にそのまま[[ZIPファイル]]から展開したりしていたと推測されます。
そのため各国で自国の [[MS-DOS]] の採用する[[OEMコードページ]]を[[ファイル名]]とする
[[ZIPファイル]]が流通することになりました。

[EG[
[54] 
例えば[[日本]]の [[DOS]] 系[[プラットフォーム]]では [[CP932]] が使われてきました。
]EG]

[171] 
[[Windows]] の時代になると、 [[Windows]] が採用する 
[[ANSIコードページ]]が[[ファイル名]]に使われるようにもなりました。
しかし [[MS-DOS]] との互換性のため、
[[OEMコードページ]]も使われ続けました。

[172] 
更に時代が進むと、 [[UTF-8]] が[[ファイル名]]に使われるようにもなりました。

[55] 
時代の変化を踏まえて [[ZIP]] の公式仕様にも変更がありました。
[[general purpose bit]] 11 を使って [[UTF-8]] を使うことが明示できるようになりました。




[REFS[

- [159] 
[TIME[2022-11-01T17:34:41.000Z]], [TIME[2025-05-25T04:36:39.159Z]] <https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT#:~:text=APPENDIX%20D%20-%20Language%20Encoding>

]REFS]

*** データ構造

[173] 
[[ZIPファイル]]には、格納する[[ファイル]]ごとに[[ファイル名]]その他の情報を記述できます。

**** general purpose bit [N[11]]

[174] 
[DFN[[[general purpose bit]] [N[11]]]] ([DFN[[N[0x0800]]]]) は、[[ファイル名]]等が
[[UTF-8]]
で[[符号化]]されているかどうかを表します。

[175] 
[N[11]] が設定されて''いない''ときは、[[ファイル名]]と[[注釈]]は、
original ZIP character encoding
(>>170)
に適合する[SHOULD[べきです]]。
[SRC[>>159]]

;; [179] 
[[仕様書]]の文面そのままの厳密な読みでは [[CP437]] を要求するものと理解されますが、
現実的には flag [N[11]]
仕様導入以前の各種の従来の[[文字コード]]への対応が求められると見なさざるを得ません。

[176] 
[N[11]] が設定されて''いる''ときは、[[ファイル名]]と[[注釈]]は、
[[UTF-8]] storage specification によって定義された[[文字符号化形]]を使い
[CITE[The Unicode Standard]] 4.1.0 [[以上]]に[[対応][Unicodeの版]]しなければ[MUST[なりません]]。
[SRC[>>159]]

[182] 
このビットのことを便宜上 [DF[UTF-8[RUBYB[フラグ][flag]]]]と呼ぶことがあります。

[177] 
[[ZIPファイル]]内の [[UTF-8]] で符号化されたデータは、
[[BOM]] を含まないことが期待されます。 [SRC[>>159]]

;; [178] なぜか[[主語が大きい]]ですが、文脈上
[[UTF-8フラグ]]が設定された場合に限定される規定と思われます。

;; [181] 
[CN[BOM]]
ではないということは、
[CN[ZWNBSP]]
と解釈されることになります。


;; [346] 
[[general purpose bit]] [N[11]] は[[ファイル]]単位の属性です。
他の[[ファイル]]とは相互作用しません。また、
[[ファイル]]の[[注釈]]には適用されますが、 
[[ZIP]] 全体の[[注釈]]には適用されません。


[190] 
[[general purpose bit]] [N[11]]
は、
ファイルの内容や[[合言葉]]の[[符号化]]を[RUBYB[暗示][imply]]するものではありません。
[SRC[>>159]]

[298] 
とはいえ現実には [[ZipCrypto]] [[合言葉]]は[[ファイル名]]と同じ[[文字コード]]で作成されている可能性が高いと考えられます。

[180] 
[[エラー処理]]などは規定がなく不正な [[UTF-8]] をどう扱うべきか不明です。

[58] 
現在では [[UTF-8フラグ]]を利用して出力する実装が多くなってきており、
[[ZIP]] を使う[[ファイル形式]]等でこれの利用を要求する技術仕様もあります。

[183] 
しかし現在でもすべての実装が [[UTF-8]] で出力するわけではなく、
[[UTF-8]] で出力する実装のすべてが [[UTF-8フラグ]]を設定するわけでもありません。
[[UTF-8]] の出力に対応していても、 [[UTF-8]] や [[UTF-8フラグ]]を既定で設定しない実装もあるようです。

[184] 
現在では多くの実装が [[UTF-8]] の[[復号]]や [[UTF-8フラグ]]の理解に対応しているようです。
しかしすべての実装が正しく取り扱えるかどうかは不安があります。

[HISTORY[

[157] 
[CITE@ja[XユーザーのBinary numberさん: 「えー zip圧縮についてなんですがぁ... 調査の結果 Macが圧縮時にエンコードをUTF-8にしてるにもかかわらず、General purpose bit 11にフラグを立てずに圧縮するのが悪いってことがわかりました()」 / X]], [TIME[午前11:28 · 2024年12月12日][2024-12-12T02:28:26.000Z]], [TIME[2024-12-14T11:15:09.000Z]] <https://x.com/_actbit/status/1867033742738591908>

[158] 
現代的ではなく[[相互運用性]]のため好ましくないのはその通りだが、歴史的経緯も何もかも無視してこのように
[[Mac]] vs [[Windows]] の対立構造に持ち込んで貶めるために使うのは[[倫理的][技術者倫理]]でない。

]HISTORY]

[HISTORY[

[345] 
[[Perlモジュール]]の [CODE[Archive::Zip]] のように、
[[general purpose bit 11]]
を[[ファイル名]]の解釈には使うのに、
[[注釈]]の解釈には使わない実装もあります。このような実装形態は中途半端で不適切です。
[TIME[2025-12-30T13:29:43.000Z]]

]HISTORY]

**** Info-ZIP Unicode 欄

[192] 
[DFN[Info-Zip Unicode]] 欄は、
[[general purpose bit]] [N[11]]
が[RUBYB[好ましからざる][not desired]]ときに使えます。
具体的には古いプログラムとの[[後方互換性]]が求められるときが想定されているようです。
[SRC[>>159]]

[193] 
Info-ZIP Unicode Comment Extra Field ([N[0x6375]])
には
[[UTF-8]] 版の[RUBYB[ファイル注釈][file comment]]を蓄積できます。
[SRC[>>159]]

[194] 
その [F[[CODE[UnicodeCom]]]] 欄の値が、 entry comment の UTF-8 版であります。
[CN[BOM]] は使いません。
[SRC[>>159]]

[196] 
Info-ZIP Unicode Path Extra Field ([N[0x7075]])
には
[[UTF-8]] 版の[[ファイル名]]を蓄積できます、
[SRC[>>159]]

[197] 
その [F[[CODE[UnicodeName]]]] 欄の値が、 entry File Name の UTF-8 版であります。
[CN[BOM]] は使いません。
[SRC[>>159]]

[203] 
明記はされていませんが、対応している実装は、
Info-ZIP Unicode 欄が存在する場合にそちらを採用し、
通常の[[ファイル名]]と[[注釈]]を無視することが期待されているようです。



-*-*-

[200] 
[[general purpose bit]] [N[11]] と Info-ZIP Unicode 欄の2つの方法がありますが、
使い分けについては次のような定めがあります。

[201] 
[[ZIPファイル]]生成時にどちらの方法によるかは、実装依存です。
[SRC[>>159]]

[195] 
ファイル名と注釈の両方が [[UTF-8]] のときは
[[General Purpose Bit]] [N[11]] (language encoding flag (EFS))
を設定することができるので、そちらを使うべきであり、
Info-ZIP Unicode Path extra field
と
Info-ZIP Unicode Comment extra field
は使う[SHOULD[べきではありません]]。
[SRC[>>159]]

[198] 
ただ[[後方互換性]]のため、
[[general purpose bit]] [N[11]]
は[[ZIPファイル]]に含めるファイルの path や comment の native character set
が既に [[UTF-8]] の場合に限って使う[SHOULD[べきです]]。
[SRC[>>159]]

[199] 
[[general purpose bit]] [N[11]] によるか、 Info-ZIP Unicode extra field
を使うかは、 Local Directory Header と Central Directory Header
とで同じとすることが期待されます。
[SRC[>>159]]


[202] 
開発者は、[[ZIPファイル]]がどちらの方法も想定し、
どちらも読み取れるようにする[SHOULD[べきです]]。
[SRC[>>159]]

-*-*-


[204] 
実際に各種の実装がどれくらいこれらを生成するのかは不明です。
実装例がないことはないようです。それこそ [[Info-ZIP]] 
が実装しています。

[347] 
非常によく使われているということでもなさそうです。
しかし使われていないというわけではありません。
あちこちで見かけるのもまた事実です。


[205] 
実際にどれくらい読み取りに対応されているのかも未知数です。

[206] 
現在となっては
[[UTF-8フラグ]]に対応していないのに Info-ZIP Unicode 欄には対応している実装は残っていないでしょうし、
[[UTF-8]] [[ファイル名]]を含めたいのに [[UTF-8]] に対応していない実装も考慮したいという状況もあまりないでしょうから、
Info-ZIP Unicode 欄は新規ではあまり[[生成]]するべきではないと思われます。

[265] 
>>263 は
Info-ZIP Unicode Path Extra Field (0x7075)
の読み取りにも対応しているようです。


**** Extended language encoding data

[185] 
0x0008 Extra Field
というものがあり、
Reserved for extended language encoding data (PFS)
と説明されています。
[SRC[>>159]]

[186] 
[[応用]]は、 
0x0008 Extra Field を使って file name storage を[RUBYB[補足][supplement]][MAY[できる]]とされます。
しかしこれは optional field であり、その保存形式は現在未定義とされます。
[SRC[>>159]]

[187] 
0x0008 Extra Field は、 general purpose bit [N[11]] が設定されている場合でも、
設定されていない場合でも[MAY[使えます]]。
[SRC[>>159]]

[191] 
ファイルの内容や[[合言葉]]の[[符号化]]は、
[[general purpose bit]] [N[11]]
が影響するものではなく、
[N[0x0008]] Extended Language Encoding Extra Field
に蓄積しなければ[MUST[なりません]]。
[SRC[>>159]]


[188] 
source or target encoding についての extended information を蓄積するものであって、
[[応用]]がファイル名やファイルの内容の符号化の task を更に補助するようなものが想定されます。
具体例として [[Java]] [[modified-UTF-8]] であるか否か、
[[UTF-8-MAC]] であるか否かのような情報の格納に使えます。
また、[[文字符号化]] ([[コードページ]]) の[RUBYB[指示][designation]]も指定できます。
これを使って [[CP437]] や [[UTF-8]] と違う[[符号化]]を [[ZIPファイル]]内で使えます。
[SRC[>>159]]

[189] 
つまり「何かもっと詳しい情報を書ける」ということだけが決まっていて、
具体的なものは何もありません。
読み書きとも無視するのが妥当と考えられます。

**** Xceed Unicode extra field

[214] 
[[Xceed]] なる実装が
[DFN[Xceed Unicode extra field]] ([DFN[[N[0x554E]]]])
を使っています。
[SRC[>>211, >>213]]

[215] 
[[ファイル名]]と[[注釈]]を格納できます [SRC[>>211, >>213]]。どちらも [[UTF-16LE]] で
[CN[BOM]] なしです。

[216] 
>>213 に当該実装で生成した [[ZIPファイル]]の実例があります。

[210] 
実際にどの程度使われているか不明です。
>>213 は[[メタ情報]]を表示するだけのソフトウェアですが、
それと本家 [[Xceed]] 以外に対応している実装も知られていません。

[REFS[

- [212] 
[CITE[Handling Unicode characters]], [TIME[2025-05-21T12:06:32.000Z]], [TIME[2025-05-25T06:28:26.315Z]] <https://xceed.com/documentation/xceed-filesystem-for-net/Handling%20Unicode%20characters.html>
- [211] 
[CITE@en[Xceed zip extra fields]], [TIME[2025-05-25T06:28:05.000Z]] <https://support.xceed.com/portal/en/community/topic/xceed-zip-extra-fields>
- [213] 
[CITE@en[Error decoding `Xceed Unicode extra field` (0x0x554e) · Issue #13 · pmqs/zipdetails]], [TIME[2025-05-25T06:28:37.000Z]] <https://github.com/pmqs/zipdetails/issues/13>

]REFS]


****ZipArchive Library Extra Field

[208] 
[[ZipArchive]] なる実装が
ZipArchive Library Extra Field ([N[0x5A4C]])
を定めています。
[SRC[>>207]]

[209] 
[[ファイル名]]の[[コードページ]]、
[[ファイル名]]、
[[注釈]]の[[コードページ]]を記述できるとしています。
[SRC[>>207]]

[210] 
実際にどの程度使われているか不明です。
これらが利用されたファイルも見つけることができません。
このソフトウェア自体の配布ファイルでも使われていません。


[REFS[

- [207] 
[CITE[ZipArchive: Unicode Support: Using Non-English Characters in Filenames, Comments and Passwords]], [TIME[2025-05-25T06:18:44.000Z]] <https://www.artpol-software.com/ZipArchive/KB/0610051525.aspx#customExtra>

]REFS]

**** host OS, zip version

[67] 
[[ファイル]]が追加された [[OS]] や [[ZIP]] 仕様の版の情報があります。
[CITE[PKZip]] の場合、追加した[[OS]]と版番号が入るようで、
これを見て
[[OEMコードページ]]と[[ANSIコードページ]]を読み分ける実装があるようです
(>>266 >>267)。

[88] 
[[ZIP]] を生成するソフトウェアが限られていて、
その挙動がすべてわかりきっている場合ならこの方法でもうまくいくのでしょうが、
実際に流通する [[ZIPファイル]]を見るにこの方法はあまり有効とは思えませんが、
どうなのでしょう。


**** その他

[330] 
[[Mac OS]] 用の拡張で[[ファイル名]]や[[注釈]]やその[[文字コード]]種別を格納できるものがいくつかあります。
[SRC[>>349]]

[REFS[

- [349] [TIME[2020-06-30T08:46:01.000Z]], [TIME[2025-12-31T09:00:44.990Z]] <https://libzip.org/specifications/extrafld.txt>

]REFS]

**** 混合

[217] 
[[文字コード]]の情報は[[ファイル]]ごとに格納されています。

[218] 
つまり[[ファイル]]によって異なる[[文字コード]]が使われる可能性があります。

[219] 
実際に [[UTF-8フラグ]]付きの [[UTF-8]] の[[ファイル名]]のファイルと、
[[UTF-8フラグ]]なしの旧来の[[文字符号化]]の[[ファイル名]]のファイルが同じ
[[ZIPファイル]]に混在する事例がちらほらみられます。

[220] 
そうした事例の中には、[[ディレクトリー]]で[[非ASCII文字]]が使われていることもあります。
[[ZIP]] では[[ファイル名]]に[[ディレクトリー]]も混在するので、
[[バイト列]]として見たときに異なるのに、
実際には[[文字列]]として等しい[[ディレクトリー]]が含まれている場合があります。
[[バイト列]]を正しく[[復号]]できれば単一の[[ディレクトリー]]になりますが、
誤って[[復号]]すると正しい名前と[[文字化け]]した名前の2つの[[ディレクトリー]]に分裂することになります。

[221] 
実際に流通しているかどうかは不明ですが、
[[UTF-8フラグ]]''なし''で、異なる[[文字コード]]の[[ファイル名]]の[[ファイル]]が混在することも理論上はあり得ます。
異なる[[プラットフォーム]]で既存の [[ZIPファイル]]に新しい[[ファイル]]を追加すると、
特別な知識なしでも容易にそうしたファイルを作り得ます。
ただそうした[[ZIPファイル]]はほぼ確実に[[文字化け]]して表示されることになりますし、
そうした作り方で異なる[[プラットフォーム]]を移動しながら[[ファイル]]を追加していくという状況はあまりなさそうですから、
そのような[[ZIPファイル]]が流通し続けることは稀かもしれません。

[222] 
こうした[[文字コード]]の混在と同名だったり同名でなかったりする[[ファイル名]]の取り扱いは、
[[セキュリティー]]上の問題を引き起こすこともありますし、
そうでなくても不具合の温床となりますから、実装者は注意が必要です。


*** ファイル名の文字コード決定

[13] 
[[ZIPファイル]]の[[ファイル名]]では
[[UTF-8]]
が使われる場合が多くなっているものの、
[[UTF-8]] 以外の [[ZIPファイル]]も過去に作成され大量に蓄積されていますし、
現在でも依然として生産され続けている実情があります。

[59] 
[[後方互換性]]のため、実装は、

- [60] [[UTF-8フラグ]]あり、 [[UTF-8]]
- [61] [[UTF-8フラグ]]なし、 [[UTF-8]]
- [62] [[UTF-8フラグ]]なし、 その他の[[文字コード]]

の読み込みに対応する必要があります。

;; [223] 
[[UTF-8フラグ]]以外の[[ファイル名]]の[[文字コード]]に関係する各種[[メタ情報]]は、
無視して構わないと思われます。

[224] 
[[UTF-8フラグ]]がない場合、どの[[文字コード]]が使われているかは 
[[ZIPファイル]]内に明記されないため、何らかの手段で決定しなければなりません。

[56] 
一般に[[バイト列]]の[[文字コード]]の決定方法は何通りかありますが [SEE[ [[文字コードの判定]] ]]、
[[ZIPファイル]]の[[ファイル名]]の場合に当てはめると次のものがあります。

- [57] 決め打ち
-- [63] [[UTF-8]] 固定、その他の特定の[[文字コード]]固定など
-- [64] 特定目的専用の実装ならこれで十分なこともあります。
-- [65] 汎用的な展開プログラムや[[プログラム]]組み込み用の[[ライブラリー]]などでは不適切です。
- [226] [[プラットフォーム]]の[[文字コード]]に固定
-- [227] [[OEMコードページ]]固定、[[ANSIコードページ]]固定
--- [229] [[Windows]] 用の実装が採用していることが多いです。
-- [228] [[POSIXロケール]]に相当する[[コードページ]]を求めてそれに固定
--- [230] [[Linux]] 等の実装が採用していることがあります。
- [231] 実行時のオプションで[[文字コード]]を指定
-- [232] [[CLI]] プログラムや[[プログラム]]組み込み用の[[ライブラリー]]などが採用していることがあります。
- [233] [[ファイル名]]の[[バイト列]]から推定
- [234] [[ZIPファイル]]の入手元の情報を利用して推定
-- [235] [[URL]] の [[TLD]]
-- [237] [[応答ヘッダー]]の [CODE[Content-Language]]
-- [236] 配布ページの [CODE[lang=""]]

[238] 
使われ方がある程度決まったソフトウェアなら利用環境などの事前知識を使うことができますが、
どんな入力があるかわからない汎用のソフトウェアは推定手法を組み合わせることになります。

[239] 
[[バイト列]]や [[URL]] を使った推定手法は [[HTML]] などで用いられており、
参考にできます。ただし、

- [240] [[Web]] とは[[文字コード]]の傾向が異なる。
[[Web]] ではまず使われない [[OEMコードページ]]が [[ZIP]]
ではむしろ主体。
- [241] [[ファイル名]]は短いことが非常に多く、
しかも[[非ASCII文字]]は更にその一部分でしかないことが多い。
正確な判定の材料が少ない。
- [242] 必ず [[URL]] が伴う [[Web]] と違って [[ZIP]]
はファイル単体で流通することが多い。

といった [[ZIP]] 固有の事情があるので、 [[Web]] 用そのままでは必ずしも有効な実装になりません。


[225] 
[[文字コード]]の決定は、厳密には[[ファイル]]ごとに行うべきですが、
[[ファイル名]]は短いことが多く[[文字コードの判定]]が難しい場合があること、
[[ファイル]]ごとに[[ファイル名]]の[[文字コード]]が異なる場合は無視していいと思われること (>>221)
から、
単独ではなく組み合わせにより行うことで精度を高められると考えられます。

[243] 
[[UTF-8]] との混在 (>>220) がある場合、
[[UTF-8]] でない[[文字コード]]の[[復号]]の結果と[[文字]]の分布が近い
([[ディレクトリー]]が該当する場合は部分一致する)
可能性があり、このことを推定の材料にできるかもしれません。

*** ファイル名に出現し得る文字コード

[244] 
[[UTF-8フラグ]]がない[[ファイル名]]で使われる[[文字コード]]の全体像は不明です。
これまでに大規模な調査などは行われたことが無さそうですし、
実行環境等に依存しない汎用的な実装をどのように作るべきかという議論もほとんど見られませんから、
手がかりが多くありません。


[245] 
実例 (>>69) がある[[文字コード]]の他に、
実装例が知られている[[文字コード]]がいくつかあり、
それ以外に言及がある[[文字コード]]もいくつかあります。
こうした情報をヒントにできそうです。
ただし[[ZIPファイル]]は公開 [[Web]]
でやり取りされないものも大量に存在すると考えられますから、
[[Web]] 上で実例が見つけられるものだけに限定して考察するのは危険と思われます。



**** ZIPのファイル名のコードページ

[246] 
[[OEMコードページ]]はすべて使われる(た)と想定するのが良いかもしれませんが、
歴史的にあまり使われなかったらしい[[OEMコードページ]]もあるので、
それらは [[ZIP]] でも使われなかった可能性があります。

[247] 
[[ANSIコードページ]]はすべて使われる(た)と想定するのが良いかもしれませんが、
[[OEMコードページ]]がもっぱら使われ[[ANSIコードページ]]は使われなかったものもあるかもしれません。


[250] 従って、一応主要な[[コードページ]]はすべて
[[ZIPファイル]]で出現し得るものとして対応するべきと考えられます。
具体的な一覧と、主に使われた[[国]]や[[言語]]との対応関係については、
[[コードページ]]の項にある一覧表を参照。

;; [90] 
実装に明示的に実装されながら、実ファイルは未発見のもの:
CP720 CP855 CP857 CP858 CP860 CP861 CP862 CP863 CP864 CP869



[266] 
>>263 によると
PKZip for Windows 2.5, 2.6, 4.0 は
central directory header で [[OEMコードページ]]を使い、
local directory header で[[ANSIコードページ]]を使うようです。
それに対処するための分岐とテストコードがあります。

[267] 
>>263 によると
PKZip version 5 以上は
[[OEMコードページ]]を使うようです。
それに対処するための分岐とテストコードがあります。

[268] 
[[PKZip]] という公式実装が使っている [[OS]] と [[ZIP]] の版の情報を
[[OEMコードページ]]と[[ANSIコードページ]]のどちらかの判定に使っているわけです。
ただ公式実装以外がこれらをどう使っているかは怪しいところではありますし、
実際の [[Web]] 上のファイルを見るにこの判定条件で正確に対処できるのかは疑わしいように思われます。
ある程度のヒントには使えるのかもしれません。


[REFS[

- [263] [CITE@en[Merge into ubuntu/devel : fix-code-pages : lp:~mitya57/ubuntu/+source/unzip : Git : Code : unzip package : Ubuntu]], [TIME[2025-05-25T14:30:02.000Z]] <https://code.launchpad.net/~mitya57/ubuntu/+source/unzip/+git/unzip/+merge/466860>



]REFS]


**** ZIPファイル名のその他の文字コード


[248] 
[[DOS]] や [[Windows]] で主に使われた[[文字コード]]の他に、
[[Unix]] で主に使われた[[文字コード]]や
[[Mac]] の[[文字コード]]が言及されることもあります。
ただ、歴史的に [[ZIPファイル]]は主に [[DOS]] 系の環境で使われてきたもので、
それ以外の環境では主に [[DOS]] 系の環境との互換性を意識して 
[[ZIPファイル]]を使うことが多かったと推測されますから、
[[Unix]] や [[Mac]] の[[文字コード]]を使った
[[ZIPファイル]]の流通量はそれほど多くない(なかった)と思われます。

;; [249] 
近年では [[ZIPファイル]]が[[書庫ファイル]]の[[事実上の標準]]となってどの環境でも普及していますが、
[[UTF-8]] を使うか、当該地域の [[Windows]] 上の主要な実装と同じ[[コードページ]]を採用するのが普通と思われます。




[145] >>81 は

>Convert filenames inside ZIP archives from autodetected older Russian encodings (koi8-r, koi8-u, cp866, windows-1251) to UTF-8.

と説明しており、[[キリル文字]]を使う
[[KOI8-R]],
[[KOI8-U]],
[[CP866]],
[[Windows-1251]],
[[UTF-8]]
について[[キリル文字]]の出現頻度の情報から[[自動判定]]します。


;; [254] [[キリル文字]]圏では [[KOI8]] シリーズがかなり使われていましたが、
[[ZIPファイル]]での実態はよくわかりません。現在のところ利用事例は確認されていません。
実利用事例の大多数は [[CP866]] です。

[252] 
>>78 では[[シフトJIS]]、[[日本語EUC]]、[[ISO-2022-JP]]、[[UTF-8]]
から[[自動判別]]する実装が紹介されています。また、
[[シフトJIS]]や[[日本語EUC]]のテストファイルも掲載しています。
しかし
[[ISO-2022-JP]]
は生成する実装があるのか不明としています。

;; [255] 
>>78 で掲載されている[[日本語EUC]]のファイルはテスト用に製作されたものです。
容易にそれを製作できる環境はあったようですが、
さて、そのようなものがどれだけ使われていたのかは不明です。

;; [253] 
[[ISO-2022-JP]] はおそらく[[日本語]]用の主要な[[文字コード]]の1つだからと対象に含められただけで、
[[ZIPファイル]]の利用事例があって実装されたわけではなさそうです。

[89] 
[CITE@ja[【2025年】zip圧縮・展開(解凍) おすすめソフト12選まとめ+解説、文字化けよさらば!【Win・Mac】 #Windows - Qiita]], [TIME[2025-07-01T05:46:06.000Z]] <https://qiita.com/ko1nksm/items/b1e320f418614372c43e>

>
zip ファイルに関しても、macOS は Shift JIS に対応しています。ただし Windows 拡張版の CP932 ではなく、Mac OS 拡張版の MacJapaneseです。つまり古い Mac OS で作成した zip ファイルを展開できるようになっています。zip ファイルの中のファイル名の文字コードは国によって様々な文字コードが使われてきました。様々な文字コードが使われる状況では文字化けしやすいのは当然です。現在では Windows も macOS も Unicode を使っているわけで、あなたに Shift JIS を使う理由がないのであれば、zip ファイルの中のファイル名にも Unicode (UTF-8) を使いましょう。

[HISTORY[

[141] 
なお、 >>89
は
[[ZIP]] の[[プロファイル]]の1つである
[[ISO/IEC 21320-1:2015]]
を
「ISO/IEC の zip の標準規格」
という誇大な説明によって自説の補強に用いています。
まあ [[ZIP]] の[[プロファイル]]は一種の [[ZIP]] の標準と言えなくもないのですが、
[[ZIP]] 
の主要な技術仕様は他の文書を参照しているだけで、
直接的にはそれに対する追加の制約部分のみしか含まれないのですから、
誤解を招くだけであり、健全な説明とはいえません。
当該主張それ自体には問題がないのに、
無理な論拠を提示することによって優良性の誤認を誘発し、自ら有用性を毀損している残念な例です。


]HISTORY]

[142] >>89

>Windows 標準の zip 機能は、正しい UTF-8 ファイル名(UTF-8 フラグが設定、または Unicode パス拡張フィールドの設定)であれば問題なく展開できたのですが、macOS 標準機能で作成した zip ファイルは、正しい UTF-8 ファイル名ではないので文字化けしてしまいます。他のソフトで文字化けしないのは、おそらく別の情報を参照しており、zip ファイルの情報に作成 OS が「Unix」と記録されていれば UTF-8 だろうと推測しているようです。[SNIP[]]

;; [143] 「他のソフト」の挙動が本当に検証したものなのか、筆者の推測なのか、これだけではよくわからない。

- [251] [CITE@en[GitHub - sanori/unzip-mbcs: UnZip for non-UTF8 encoding such as cp949, sjis, gbk, euc-kr, euc-jp, and gb2312]], [TIME[2025-10-19T11:13:01.000Z]] <https://github.com/sanori/unzip-mbcs>
- [256] [CITE@en[GitHub - sanori/node-unzip-mbcs: UnZip for non-UTF8 encoding such as cp949, sjis, gbk, euc-kr, euc-jp, and gb2312]], [TIME[2025-10-19T11:13:08.000Z]] <https://github.com/sanori/node-unzip-mbcs>

[257] >>251 >>256 は次のものの読み込みに対応しています。

>Major non-UTF8 encodings by languages:
-    Korean: cp949, euc-kr
-    Japanese: sjis (shift_jis), cp932, euc-jp
-    Chinese: gbk, gb18030, gb2312, cp936, hkscs, big5, cp950

[258] テストデータとしてテスト用に作成されたと思われる [[ZIP]]
ファイルがありますが、 [CODE[cp949]] のものと [CODE[sjis]]
のもののみで、それ以外は有名な[[符号化]]に対応しただけかもしれません。

[332] 
[CITE[The OpenNET Project: Работа с русскими именами файлов в ZIP и UNZIP под *nix]], [TIME[2025-12-30T09:50:35.000Z]] <https://www.opennet.ru/tips/2494_zip_rus_patch.shtml>


*** ファイル名文字コードの自動判定

[269] 
[[ZIPファイル]]の[[ファイル名]]の[[文字コードの判定]]は、
一般の[[文字コードの判定]]問題に加えて [[ZIPファイル]]特有の事情にも配慮が必要です (>>239)。

[270] 
一般の[[文字コードの判定]]問題も完全に正確に回答を得ることは不可能で、
各種実装をみてもどれも一長一短で完璧なものはありません。 [SEE[ [[文字コードの判定]] ]]
[[ファイル名]]は短い文字列なので、
難度は更に高まります。

[271] 
従って[[URL]]や[[ロケール]]などの補助的情報があれば、それを組み合わせて候補を絞り込むことが重要になってきます。

[272] 
誤判定を予期して、実行時オプション等の形で手動で上書きする仕組みを併用することも重要です。



[76] 
実装事例等:

[REFS[

-
[86] 
[CITE[SUMMARY: Zip/Unzip and encoding problem (Was: Re: How to detect the encoding of a string?)]], [TIME[2025-05-23T12:03:58.000Z]], [TIME[2006-05-04T04:53:45.961Z]] <https://web.archive.org/web/20060504040848/http://mail.nl.linux.org/linux-utf8/2005-06/msg00010.html>
- [77] 
[CITE@en[Bug #177929 “Should autodetect filename character encoding in zi...” : Bugs : file-roller package : Ubuntu]], [TIME[2025-05-16T09:43:23.000Z]] <https://bugs.launchpad.net/ubuntu/+source/file-roller/+bug/177929>
- [87] 
[CITE@en[Add option to unzip to detect the encoding of filenames : Blueprints : unzip]], [TIME[2025-05-23T12:05:27.000Z]] <https://blueprints.launchpad.net/unzip/+spec/unzip-detect-filename-encoding>
-[81] 
[CITE@en[GitHub - vlm/zip-fix-filename-encoding: Fix cyrillic character encoding of filenames inside zip archives]], [TIME[2025-05-16T10:03:38.000Z]] <https://github.com/vlm/zip-fix-filename-encoding>
-- [144] 
[CITE@en[zip-fix-filename-encoding/src/runzip.c at master · vlm/zip-fix-filename-encoding · GitHub]], [TIME[2025-05-24T14:05:58.000Z]] <https://github.com/vlm/zip-fix-filename-encoding/blob/master/src/runzip.c>
- [78] 
[CITE@ja[Develop/UnzipTestcase - Ubuntu Japanese Wiki]], [TIME[2025-05-16T09:43:54.000Z]] <https://wiki.ubuntulinux.jp/Develop/UnzipTestcase>


]REFS]


- [303] [CITE@en[ZIP Mojibake Fixer]], [TIME[2021-04-12T14:28:40.000Z]], [TIME[2025-11-22T14:11:46.084Z]] <https://ianharmon.github.io/mojibake-fixer/>
-- [304] [[シフトJIS]]とみなして変換する実装





*** 実ファイル例

[69] 各種[[文字コード]]の[[ファイル名]]の入った[[ZIPファイル]]:

[REFS[


- [106] [[CP437]]
-- [107] [CITE@en[Access to documents requests (in French only)]], [[Institut de la statistique du Québec]], [TIME[2025-05-24T03:09:07.000Z]] <https://statistique.quebec.ca/en/institut/our-organization/access-to-information/access-to-documents-requests>
--- [108] 
<https://statistique.quebec.ca/fr/fichier/demande-acces-9448-24.zip>
-- [110] 
[CITE@en[Submitting a request]], [[Institut de la statistique du Québec]], [TIME[2025-05-24T03:14:59.000Z]] <https://statistique.quebec.ca/en/services-recherche/submitting-a-request>
--- [109] <https://statistique.quebec.ca/en/fichier/rda-startup-kit.zip>
---- [307] [[ASCII文字]]のみのものに変更確認 [TIME[2025-12-13T02:08:03.00Z]]
---- [308] 
[CITE[Wayback Machine]], [TIME[2025-12-13T02:07:40.000Z]] <https://web.archive.org/web/20250524031518/https://statistique.quebec.ca/en/fichier/rda-startup-kit.zip>
----- [309] [[非ASCII文字]]が含まれていた時代のもの
-- [112] 
[CITE@fr[Outils promotionnels En nature, ma sécurité, c’est ma responsabilité | Gouvernement du Québec]], [TIME[2025-05-24T03:17:27.000Z]] <https://www.quebec.ca/securite-situations-urgence/securite-civile/soutien-partenaires/outils-promotionnels-nature-securite-responsabilite>
--- [111] <https://cdn-contenu.quebec.ca/cdn-contenu/adm/min/securite-publique/publications-adm/publications-secteurs/securite-civile/soutien-partenaires/jpg_gif_hd.zip>
-- [313] 
[CITE@en[ZipInfo corrupts file names in some old zip archives · Issue #84353 · python/cpython]], [TIME[2025-12-30T08:42:31.000Z]] <https://github.com/python/cpython/issues/84353>
--- [314] 
[TIME[2025-12-30T08:42:48.100Z]]
<https://bugs.python.org/file49030/example.zip>
---- [315] [[ファイル名]]と [[ZIPファイル]]全体の[[注釈]]が [[IBM437]] ([[罫線]]等)。
--- [316] 
[TIME[2025-12-30T08:43:29.200Z]]
<https://github.com/python/cpython/files/14594709/name_bug.zip>
---- [317] [CODE[test.zip]]
----- [318] [[ファイル名]]が [[IBM437]] ([[括弧]])。
-- [323] [CITE@en[Regression: ZipFile/ZipArchive entry name decoding not working correctly when entryNameEncoding is specified · Issue #92283 · dotnet/runtime]], [TIME[2025-12-30T09:41:02.000Z]] <https://github.com/dotnet/runtime/issues/92283#issuecomment-2109982824>
--- [324] 
[TIME[2025-12-30T09:41:29.500Z]]
<https://github.com/dotnet/runtime/files/15307551/Documentacion.zip>
---- [327] [[Info-Zip Unicode]] 欄あり
--- [325] 
[TIME[2025-12-30T09:41:40.400Z]]
<https://github.com/dotnet/runtime/files/15316539/UnzipNames.zip>
---- [328] [[Info-Zip Unicode]] 欄あり
---- [326] [[UTF-8]] (フラグ付き) と混在
- [150] [[CP737]]
-- [151] 
[CITE@en[Comment #12 : Bug #580961 : Bugs : unzip package : Ubuntu]], [TIME[2025-05-25T01:39:27.000Z]] <https://bugs.launchpad.net/ubuntu/+source/unzip/+bug/580961/comments/12>
--- [149] 
<https://www.ops.gr/Ergorama/fileUploads/ypiresiaops/prokirikseis/biografiko.zip>
-- [99] 
[CITE@el[Διακηρύξεις μίσθωσης και εκμίσθωσης ακινήτων. - Διεύθυνση Διοικητικών Υπηρεσιών - Ελληνική Δημοκρατία - Περιφέρεια Αττικής]], [TIME[2025-05-23T15:18:47.000Z]] <https://opendata.attica.gov.gr/content/genikh-dieythynsh-eswterikhs-leitoyrgias/d-nsh-dioikhtikwn-yphresiwn/155-diakhrykseis>
---
[98] 
<https://opendata.attica.gov.gr/content/genikh-dieythynsh-eswterikhs-leitoyrgias/d-nsh-dioikhtikwn-yphresiwn/155-diakhrykseis?fdl=YTJ4TDV2Tnh1ZzAzZG9KSkRWZXVEcVZtY2ZHZDZoS1owc2FyY0tQNUovSGFqMkhpK2xZNkxOVHBxdHFaeWNSdGVFY3JMMjEzUzNKbmRXeGhlSGQ0VEZCWVNFRTFRVDA5>
---- [100] [[UTF-8]] (フラグあり) のファイルと混在
---
[101] 
<https://opendata.attica.gov.gr/content/genikh-dieythynsh-eswterikhs-leitoyrgias/d-nsh-dioikhtikwn-yphresiwn/155-diakhrykseis?fdl=WGNVMDZpUXBkL0VvczA4L0RHM1NMVWxCMkRQSUdMdWlDbjNFY1VGZTZSQXk2aEJoWGhoSkRGZWtSa0diR2c0MVltZ3ZNa3R1VTA1MlZUWnNSM0p6V21wWk5ERk5VVDA5>
- [137] [[CP775]]
-- [138] [CITE@en[LIFE EcosystemServices]], [TIME[2025-05-24T07:14:58.000Z]] <https://ekosistemas.daba.gov.lv/public/eng/deliverables_and_publications1/ecosystem_services_mapping/>
---[139] 
<https://ekosistemas.daba.gov.lv/upload/File/02%20Biotopu%20kvalit%C4%81tes%20kartes.zip>
-- [319] 
[CITE@en[Regression: ZipFile/ZipArchive entry name decoding not working correctly when entryNameEncoding is specified · Issue #92283 · dotnet/runtime]], [TIME[2025-12-30T09:21:35.000Z]] <https://github.com/dotnet/runtime/issues/92283>
--- [320] 
[TIME[2025-12-30T09:21:55.500Z]]
<https://github.com/dotnet/runtime/files/12662810/test_win.zip>
--- [321] 
[TIME[2025-12-30T09:40:46.200Z]]
<https://github.com/dotnet/runtime/files/12662809/test_dotnet.zip>
---- [322] こちらは [[UTF-8]] (フラグあり)
- [102] [[CP850]]
-- [103] 
[CITE[Portal Autárquico - Publicações on-line]], [TIME[2025-05-24T02:38:51.000Z]], [TIME[2025-05-24T02:55:21.283Z]] <https://portalautarquico.dgal.gov.pt/pt-PT/servicos-on-line/biblioteca/publicacoes-on-line/>
--- [104] 
<https://portalautarquico.dgal.gov.pt/ficheiros/?schema=f7664ca7-3a1a-4b25-9f46-2056eef44c33&channel=266f4a32-848e-4d2c-99c6-ad5b5511d7fe&content_id=143C8989-5D21-45F1-8EC0-7CEAEAC0049E&field=storage_image&lang=pt&ver=1&filetype=zip&dtestate=2024-04-22132849>
--- [105] 
<https://portalautarquico.dgal.gov.pt/ficheiros/?schema=f7664ca7-3a1a-4b25-9f46-2056eef44c33&channel=266f4a32-848e-4d2c-99c6-ad5b5511d7fe&content_id=C73AC715-5085-48A0-9D5B-64C92E0D092F&field=storage_image&lang=pt&ver=1&filetype=zip&dtestate=2024-04-22132817>
--[284] [CITE@pt-PT[O mundo da tradução na Dokutech Translations]], [TIME[2025-11-15T11:36:27.000Z]] <https://repositorium.uminho.pt/entities/publication/45bd0926-6e82-4f96-b97d-a88b2f2c6139>
--- [285] <https://repositorium.uminho.pt/bitstreams/083f5a66-91d9-4309-98e2-b5190fc9b95f/download>
-- [286] 
[CITE@pt-PT[A dinamização cultural dos recursos informativos do Arquivo Municipal de Paredes de Coura]], [TIME[2025-11-15T11:40:08.000Z]] <https://repositorium.uminho.pt/entities/publication/5f48e172-165d-422f-99f3-932184384ba2/full>
--- [287] 
<https://repositorium.uminho.pt/server/api/core/bitstreams/ac1b90d9-8d44-43ad-b26a-22933743fb67/content>
-- [290] 
[CITE@pt-pt[Acesso aos arquivos | OMIP]], [TIME[2025-11-15T11:31:10.000Z]], [TIME[2025-11-15T11:46:15.431Z]] <https://www.omip.pt/pt/downloads>
--- [289] 
<https://www.omip.pt/system/files/2023-02/Circulares%20OMIP_20.Fev_.2023_PT.zip>
--- [288] 
<https://www.omip.pt/system/files/2023-02/Circulares%20OMIP_27.Feb_.2023_ES.zip>
--- [291] 
<https://www.omip.pt/system/files/2020-03/general_models_es.zip>
--- [292] 
<https://www.omip.pt/system/files/2020-03/omip_models_es.zip>
--- [293] 
<https://www.omip.pt/system/files/2020-03/omip_models_pt.zip>
-- [295] 
[CITE@pt-br[Pesquisa de Ações Discriminatórias no Âmbito Escolar — Instituto Nacional de Estudos e Pesquisas Educacionais Anísio Teixeira | Inep]], [TIME[2025-11-15T11:59:38.000Z]] <https://www.gov.br/inep/pt-br/acesso-a-informacao/dados-abertos/microdados/pesquisa-de-acoes-discriminatorias-no-ambito-escolar>
--- [294] 
<https://download.inep.gov.br/microdados/microdados_pesquisa_acoes_discriminatorias_ambito_escolar_2008.zip>
-- [297] 
[CITE@pt-br[Enem por Escola — Instituto Nacional de Estudos e Pesquisas Educacionais Anísio Teixeira | Inep]], [TIME[2025-11-15T12:02:13.000Z]] <https://www.gov.br/inep/pt-br/acesso-a-informacao/dados-abertos/microdados/enem-por-escola>
--- [296] 
<https://download.inep.gov.br/microdados/enem_por_escola/2005_a_2015/microdados_enem_por_escola.zip>
-- [46] 
[CITE@fr[Recherche - Les services de l'État en Gironde]], [TIME[2025-05-22T02:50:00.000Z]], [TIME[2025-05-23T10:54:08.958Z]] <https://www.gironde.gouv.fr/contenu/recherche/(offset)/1350?SearchText=&dateFilter[]=>
--- [47] 
<https://www.gironde.gouv.fr/contenu/telechargement/45738/310633/file/G%C3%A9n%C3%A9rac.zip>
---- [48] [CODE[[[Content-Language]]: [[fr-FR]]]]
--- [17] [[CP437]] とも等しい
- [113] [[CP852]]
-- [115] 
[CITE@cs[Technologická agentura ČR]], [TIME[2025-05-24T03:27:05.000Z]] <https://tacr.gov.cz/dokumenty/prostredi-pro-zivot-2-logolinky-zip>
--- [114] 
<https://tacr.gov.cz/wp-content/uploads/documents/2024/01/29/1706524597_Prostr%CC%8Cedi%CC%81%20pro%20z%CC%8Civot%202_logolinky.zip>
---- [118] [[UTF-8]] フラグ付きと混在
---- [348] [[Info-ZIP]] 名もあり
-- [116] 
[CITE@cs[C121040 Dodatečné informace.zip, MŠMT ČR]], [[QCM, s.r.o web@qcm.cz http://www.qcm.cz]], [TIME[2025-05-24T03:31:03.000Z]] <https://msmt.gov.cz/file/26589/>
--- [117] 
<https://msmt.gov.cz/file/26589_1_1/download/>
-- [120] 
[CITE[Ministarstvo zaštite okoliša i zelene tranzicije Republike Hrvatske - Financijski dokumenti]], [TIME[2025-05-24T03:39:50.000Z]] <https://mzozt.gov.hr/pristup-informacijama-4924/strategije-planovi-izvjesca-i-ostali-dokumenti/financijski-dokumenti/1071?big=0>
--- [119] 
<https://mzozt.gov.hr/UserDocsImages//Pristup%20informacijama//07805%20Financijski%20plan%202025-2027.zip>
-- [131] 
[CITE@pl-PL[Pliki do pobrania KSeF]], [TIME[2025-05-15T08:27:18.000Z]], [TIME[2025-05-24T05:49:17.015Z]] <https://ksef.podatki.gov.pl/baza-wiedzy-ksef/pliki-do-pobrania-ksef/>
--- [130] 
<https://ksef.podatki.gov.pl/media/afqfu0g4/przykladowe-pliki-dla-struktury-logicznej-e-faktury-fa-2.zip>
- [94] [[CP857]]
--
[95] 
[CITE@tr[YOZGAT GENÇLİK VE SPOR İL MÜDÜRLÜĞÜ]], [[T.C. Gençlik ve Spor Bakanlığı]], [TIME[2025-05-23T14:58:12.000Z]] <https://yozgat.gsb.gov.tr/Sayfalar/1916/388/Kul%C3%BCp%20%C4%B0%C5%9Flemleri.aspx>
--- [96] 
<https://yozgat.gsb.gov.tr/Public/Edit/images/IM/83/Kul%C3%BCp%20Tescil%20Bilgileri/1-Spor%20Kul%C3%BCpleri%20ile%20ilgili%20Mevzuatlar.zip>
- [121] [[CP866]]
-- [123] 
[CITE[НАЧАЛО - Контролна дейност - Годишни планове за контролната дейност - Годишни планове за контролната дейност на РИОСВ-Стара Загора - Регионална инспекция по околната среда и водите - РИОСВ -Стара Загора]], [TIME[2025-05-24T03:47:49.000Z]] <https://stz.riew.gov.bg/Godishni_planove_za_kontrolnata_deynost_na_RIOSV_Stara_Zagora-p447>
--- [122] 
<https://stz.riew.gov.bg/files/File/%D0%93%D0%BE%D0%B4%D0%B8%D1%88%D0%B5%D0%BD%20%D0%BF%D0%BB%D0%B0%D0%BD/59KZ-Plan_2015.zip>
-- [125] 
[CITE@mk-MK[Квартални извештаи – Општина Куманово]], [TIME[2025-05-24T03:57:50.000Z]] <https://kumanovo.gov.mk/document-category/kvartalni/>
--- [126] 
<https://kumanovo.gov.mk/wp-content/uploads/2022/04/IV-%D0%BA%D0%B2%D0%B0%D1%80%D1%82%D0%B0%D0%BB-2021.zip>
---- [127] [[UTF-8]] フラグ付きと混在
--- [124] 
<https://kumanovo.gov.mk/wp-content/uploads/2022/04/III-%D0%BA%D0%B2%D0%B0%D1%80%D1%82%D0%B0%D0%BB-2021.zip>
-- [132] 
[TIME[2025-05-24T06:27:33.000Z]]
<https://data.gov.ua/dataset/36f4ddb7-b1f5-4971-b94e-76cb4e1bca58/resource/46c69404-5354-42a9-8b21-0a4994bba701/download/2020-vid-11-11.zip>
-- [147] 
[CITE@en[undefined is not an object (evaluating 'zip.file(/\.fb2$/)'''['''0''']'''.async') · Issue #629 · johnfactotum/foliate]], [TIME[2025-05-25T01:12:59.000Z]] <https://github.com/johnfactotum/foliate/issues/629>
--- [146] 
<https://github.com/johnfactotum/foliate/files/5572506/_-_._.fb2.zip>
---- [148] >>147 では [[KOI8-R]] と推測されているが実際には [[IBM866]] と思われる
-- [156] 
[CITE@en[Add proper support for CP1251 in case of generated Zip archive under Windows via 7zip · Issue #23 · mrkkrp/zip]], [TIME[2025-05-25T02:50:24.000Z]] <https://github.com/mrkkrp/zip/issues/23>
--- [155] 
<https://github.com/mrkkrp/zip/files/491598/vaz.zip>
--- [331] [[CP1251]] だと言っているのは誤り。
-- [283] 
[TIME[2025-11-11T11:08:04.900Z]]
<https://web.archive.org/web/20001102025703/http://www.uzpak.uz/comerce.zip>
- [14] [[CP874]]
-- [15] 
[TIME[2025-05-17T03:38:24.000Z]] <https://pathumthani.industry.go.th/th/3/content>
--- [16] 
<https://pathumthani.industry.go.th/web-upload/45x67bf7a6fe8eeb7d38245cecd679435cf/m_document/28692/99893/file_download/3a457beb0c64023c079bb0275d87b88f.zip>
- [72] [[CP932]] 
-- [74] 
[TIME[2025-05-12T12:47:57.00Z]]
<https://www.city.yokohama.lg.jp/tsuzuki/kusei/koho/koho_tsuzuki/kohoback/R2tzkoho.files/2004tsuzuki-text.zip>
-- [75] 
[TIME[2025-05-12T12:53:38.00Z]]
<https://www.city.yokohama.lg.jp/totsuka/shokai/gaiyo/totsukafuoto/kategori_sagasu/sonota/c04-01-mt_fuji01.files/c04-01-0006.zip>
-- [73] 
[TIME[2025-05-12T11:46:36.00Z]]
<https://www2s.biglobe.ne.jp/~ant/gaiji.zip>
--- ([[半角カタカナ]])
-- >>78
-- [260] 
[CITE@en[unzip-mbcs/test/test_unzipmbcs.py at master · sanori/unzip-mbcs · GitHub]], [TIME[2025-10-19T11:15:44.000Z]] <https://github.com/sanori/unzip-mbcs/blob/master/test/test_unzipmbcs.py>
--- [261] [[合言葉]]にも[[非ASCII文字]]
-- [97] 
[CITE@en[japanese file name encoding are corrupted · Issue #384 · Stuk/jszip]], [TIME[2025-11-22T13:44:07.000Z]] <https://github.com/Stuk/jszip/issues/384>
-- [301] 
[CITE@en[Some test data · Issue #2 · ianharmon/mojibake-fixer]], [TIME[2025-11-22T14:05:57.000Z]] <https://github.com/ianharmon/mojibake-fixer/issues/2>
--- [302] [[文字化け]]のまま保存しなおしたファイル名と混在
-- [341] 
[CITE@en['''['''Feature Request''']''': Manually specify character encoding / codepage / mcp · Issue #248 · rikyoz/bit7z]], [TIME[2025-12-30T10:08:52.000Z]] <https://github.com/rikyoz/bit7z/issues/248>
-- [350] 
[TIME[2025-12-31T11:59:12.800Z]]
<https://opendata.city.sagamihara.kanagawa.jp/dataset/eea0ce8c-2429-41f4-acdb-15ea13ac0353/resource/268a70c1-174b-4109-8658-0097184d7ee2/download/732832.zip>
- [79] [[EUC-JP]]
-- >>78
--- [80] 
<https://wiki.ubuntulinux.jp/Develop/UnzipTestcase?action=AttachFile&do=get&target=unzip_EUC-JP_testfile.zip>
- [49] [[CP936]]
-- [51] 
[CITE@en[北京市交通委员会]], [TIME[2025-03-06T06:27:17.000Z]], [TIME[2025-05-23T11:18:33.842Z]] <https://jtw.beijing.gov.cn/xxgk/czxzj/202409/t20240903_3788312.html>
--- [50] 
[TIME[2025-05-23T11:18:29.000Z]]
<https://jtw.beijing.gov.cn/xxgk/czxzj/202409/P020241212524044343049.zip>
-- [339] 
[CITE@en[System.IO.Compression results in garbled Chinese directory names when extracting. · dotnet/runtime · Discussion #104280 · GitHub]], [TIME[2025-12-30T10:03:22.000Z]] <https://github.com/dotnet/runtime/discussions/104280>
--- [340] 
[TIME[2025-12-30T10:03:41.000Z]]
<https://github.com/user-attachments/files/16069900/default.zip>
- [52] [[CP949]]
-- [66] 
[CITE@ko[학회/행사/기타 안내 상세보기(일상생활에서 개인정보 지키는 꿀팁!(개인정보 보호 주간 9.30.-10.4.)) | 국립국어원]], [TIME[2025-05-23T11:20:55.000Z]] <https://www.korean.go.kr/front/board/boardStandardView.do;front=02D474CEED6BC6E2426609D7FD6CA64E?board_id=7&b_seq=938&mn_id=186>
--- [82] 
<https://www.korean.go.kr/common/download.do?file_path=event&c_file_name=4bb0df72-593c-4cde-87ec-5c3e82b645f4.zip&o_file_name=%EC%9D%BC%EC%83%81%EC%83%9D%ED%99%9C%EC%97%90%EC%84%9C%20%EA%B0%9C%EC%9D%B8%EC%A0%95%EB%B3%B4%20%EC%A7%80%ED%82%A4%EB%8A%94%20%EA%BF%80%ED%8C%81(%EA%B0%9C%EC%9D%B8%EC%A0%95%EB%B3%B4%20%EB%B3%B4%ED%98%B8%EC%A3%BC%EA%B0%84%20%EC%B9%B4%EB%93%9C%20%EB%89%B4%EC%8A%A4).zip>
---- [83] [CODE[Content-Type: application/zip;charset=utf-8]]
-- [84] 
[CITE@ko[시정소식 < 새소식 < 용인소식 < HOME : 용인시청 대표포털]], [TIME[2025-05-23T11:37:27.000Z]] <https://www.yongin.go.kr/user/bbs/BD_selectBbs.do?q_bbsCode=1001&q_bbscttSn=20240219075251883>
--- [85] 
<https://www.yongin.go.kr/component/file/ND_fileDownload.do?q_fileSn=395735&q_fileId=ac01f7a4-ddee-47dd-b505-b2e134c1f2ae>
-- [259] 
[CITE@en[unzip-mbcs/test/test_unzipmbcs.py at master · sanori/unzip-mbcs · GitHub]], [TIME[2025-10-19T11:15:44.000Z]] <https://github.com/sanori/unzip-mbcs/blob/master/test/test_unzipmbcs.py>
--- [262] [[EUC-KR]] でない [[UHC]]
- [71] [[CP950]]
-- [70] 
[TIME[2025-05-12T11:45:46.700Z]]
<https://www.cns11643.gov.tw/opendata/MapingTables.zip>
-- [134] 
[CITE@zh-cn[政府物流服务署 - 政府物流服务署现有通用物品定期合约的招标文件]], [TIME[2022-03-24T07:00:26.000Z]], [TIME[2025-05-24T06:52:44.853Z]] <https://www.gld.gov.hk/zh-cn/our-services/one-stop/supplier-corner/tender-document/>
--- [133] 
<https://www.gld.gov.hk/assets/gld/download-files/tender-document/A9900602021.zip>
---- [311] 消滅確認 [TIME[2025-12-13T02:31:40.900Z]]
---- [312] 
[CITE[Wayback Machine]], [TIME[2025-12-13T02:31:25.000Z]] <https://web.archive.org/web/20250524064833/https://www.gld.gov.hk/assets/gld/download-files/tender-document/A9900602021.zip>
--[136] 
[CITE[null]], [TIME[2025-05-24T06:59:00.000Z]] <https://portal.dsedj.gov.mo/webdsejspace/addon/msglistdsejform/MsgListDsejForm_view_page.jsp?langsel=c>
--- [135] 
<https://portal.dsedj.gov.mo/webdsejspace/addon/upload/Upload_viewfile_page.jsp?id=45777&sid=&>
---- [310] [[Info-ZIP Unicode Path Extra Field]] もあり。
---- [329] [CODE[Content-Type: application/x-zip-compressed; charset=utf-8]],
[CODE[Content-Disposition: attachment; filename="DSEDJ-D81c_DOC.zip"]]
[TIME[2025-12-31T02:57:38.000Z]]
- [152] [[CP1251]]
-- [154] 
[CITE[#779207 - unzip fails to unpack filenames containing 'ä' 'ö' 'ü' -> results in "(invalid encoding)" - Debian Bug report logs]], [TIME[2025-05-25T01:59:29.000Z]] <https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=779207#51>
--- [153] 
<https://bugs.debian.org/cgi-bin/bugreport.cgi?att=3;bug=779207;filename=%D0%94%D0%B8%D0%BA%D0%B8%D0%B9+%D0%BF%D0%BE%D0%BC%D0%B5%D1%89%D0%B8%D0%BA.htm.zip;msg=61>
- [335] [[CP1252]]
-- [336] 
[CITE@en[zipfile: Corrupts filenames containing non-UTF8 characters · Issue #83042 · python/cpython]], [TIME[2025-12-30T09:59:19.000Z]] <https://github.com/python/cpython/issues/83042>
--- [337] 
[TIME[2025-12-30T09:59:43.00Z]]
<https://bugs.python.org/file48724/t.zip>
---- [338] 
完全にテスト用のファイル名で[[非ASCII文字]]は1バイトのみ。
投稿者が [[ISO-8859-1]] であると説明しているが、
その説明がなければ決定不能。
- [91] [[UTF-8]] (フラグなし)
--[93] 
[CITE[Hướng dẫn thực hiện Chương trình giáo dục trung học năm học 2021-2022 - Mạng lưới giáo dục trực tuyến – goEdu]], [[Mạng lưới giáo dục trực tuyến – goEdu]], [TIME[2025-05-23T13:29:40.000Z]] <https://go.vn/details/4859>
--- [92] 
<https://res.ioe.vn/edu/EOlympic/DispatchDoc/original/2021/9/THCS.zip?_gl=1*eorw4l*_gcl_au*MTgzNzEzODc3Ni4xNzQ4MDA2NzA0>
--[129] 
[CITE@en[المؤسسة العامة للري - الهوية واللوائح]], [[ThemeTags]], [TIME[2025-05-24T05:40:47.000Z]] <https://www.sio.gov.sa/About/Rules_Regulations/1>
--- [128] 
<https://www.sio.gov.sa/assets/files/guide_files/Arabic.zip>
-- [300] 
[CITE@en['''['''BUG''']'''Garbled characters in Japanese environment · Issue #1444 · aonez/Keka]], [TIME[2025-11-22T13:49:51.000Z]] <https://github.com/aonez/Keka/issues/1444>
-- [305] 
[CITE@en["Could not load content" error? · Issue #1 · ianharmon/mojibake-fixer]], [TIME[2025-11-22T14:24:59.000Z]] <https://github.com/ianharmon/mojibake-fixer/issues/1>
--- [306] 元々[[シフトJIS]]だった[[バイト列]]を
[[IBM437]] と誤認して [[UTF-8]] に変換したもの
-- [333] 
[CITE@en[ZipFile: Bugfix: Use unicode encoding to read the name string if UseUnicode is set by TalAloni · Pull Request #284 · icsharpcode/SharpZipLib · GitHub]], [TIME[2025-12-30T09:55:31.000Z]] <https://github.com/icsharpcode/SharpZipLib/pull/284>
--- [334] 
[TIME[2025-12-30T09:55:36.000Z]]
<https://github.com/icsharpcode/SharpZipLib/files/2522058/UTF8_Filenames.zip>
-- [343] 
[CITE@en[interpret filenames as UTF-8 even without general purpose bit 11 to workaround Mac bug · Issue #84 · thejoshwolfe/yauzl]], [TIME[2025-12-30T10:13:36.000Z]] <https://github.com/thejoshwolfe/yauzl/issues/84>
--- [342] 
[TIME[2025-12-30T10:12:56.000Z]]
<https://github.com/thejoshwolfe/yauzl/files/1973376/default.zip>

]REFS]

*** 文字表現の制約

[68] 
同じ [[UTF-8]] でも [[Windows]] などでは [[NFC]] 系の[[正規化]]に近い状態が一般的で
(ただし必ずしも[[正規化]]されるわけではない)、
[[Mac]] では [[NFD]] 系の[[正規化]]が適用されている状態
([SEE[ [[HFS+のNFD]] ]])
が標準的です。
これは[[ZIPファイル]]の[[ファイル名]]に限ったものではなく、
[[ファイル名]]の扱い全般に関する[[プラットフォーム]]の挙動の差異なのですが、
どの[[プラットフォーム]]で[[ZIPファイル]]を作成するかによって[[プラットフォーム]]の違いが
[[ZIPファイル]]にそのまま持ち込まれることになります。

;; [274] [[ZIPファイル]]の仕様としてはどうするのが良いとは特に決まっていません。
つまり、どの挙動が正しい、間違いといえるものではありません。


[273] 
[[ZIPファイル]]の[[文字コード]]を扱う実装や解説などの中には、
[[Mac]] の挙動を [[UTF-8-MAC]] などと称するものがあります ([[ZIPファイル]]に限らず、
この話題でしばしば使われる通称です)。

[HISTORY[

[275] 
中には [[Mac]] の挙動が不適切であるかのように扱うものもあります
[SRC[>>140]] が、 [[Mac]] がおかしなことをしているわけではありません。
現実に不都合が生じるかもしれませんが、それは [[Mac]] が悪いのではなく、
[[Unicode]] と [[ZIP]] の仕様に由来する不便です。

]HISTORY]

[276] 
[[ZIPファイル]]から取り出した[[ファイル]]の[[プラットフォーム]]の[[ファイルシステム]]上の[[ファイル名]]をどのように決めるかは、
[[ZIPファイル]]内の[[ファイル名]]と[[ファイルシステム]]の制約を勘案しつつ決めなければなりません。
[[ファイルシステム]]の必須の制約を満たすことは不可避の条件となりますが、
必須条件でない[[プラットフォーム]]の慣習と[[ZIPファイル]]の格納値の折り合いをどうつけるかは、
設計方針の問題となります。

[EG[

[277] 
例えば[[文字]] [VAR[C]] を使えない[[ファイルシステム]]に[[ファイル]]を保存するときは、
エラーにするか、
他の[[文字]]に置き換えるか、
[[利用者]]に尋ねるか、といった何らかの操作が必要になります。

]EG]

[EG[

[278] 
例えば[[文字]] [VAR[C]] を保存できる[[ファイルシステム]]で、
[[プラットフォーム]]の慣習上 [VAR[C]] は [VAR[D]] と表現するのが適切な
([[利用者]]が新規で作成したとするなら [VAR[D]] と表現される)
環境で[[ファイル]]を保存するときは、
[VAR[C]] のままにするか、
[VAR[D]] に置き換えるか決めることになります。

[279] 
[VAR[D]] の方が[[利用者]]が扱いやすいかもしれませんが、
[VAR[C]] のままにしておかなければ[[ファイル名]]による[[相互参照]]が崩れるリスクがあります。

]EG]

[REFS[

- [140] [CITE@en[GitHub - tats-u/zifu: ZIPファイルのファイル名のエンコーディングをUTF-8に直すツール / Tool that fixes file names in ZIP archives (make them UTF-8)]], [TIME[2025-05-24T13:54:26.000Z]] <https://github.com/tats-u/zifu>

]REFS]

** HFS

*** 実装


- [264] 
[CITE@en[Unable to open some CD-ROM disk images containing HFS partitions · Issue #15 · unsound/hfsexplorer]], [TIME[2025-10-24T15:46:25.000Z]] <https://github.com/unsound/hfsexplorer/issues/15>

*** 實例

- [280] [[MacJapanese]]
-- [281] 
[CITE@en[CD-ROM MACLIFE 77 - KanjiTalk 7.5 (1995-01) : BNN (Bug News Network) : Free Download, Borrow, and Streaming : Internet Archive]], [TIME[2025-10-24T15:47:40.000Z]] <https://archive.org/details/maclife-kanjitalk-75>
-- [282] 
[CITE@en[INFO-MAC MAY 1993 (Japanese) : Pacific HiTech : Free Download, Borrow, and Streaming : Internet Archive]], [TIME[2025-10-24T15:48:06.000Z]] <https://archive.org/details/info-mac-may-1993-japanese>




* メモ