いつからかSlackのチャンネル名に日本語が使えるようになったが、SlackからエクスポートしたZIPファイルのファイル名、ディレクトリ名はcp437
コードページ437 - Wikipedia
でエンコードされているため、UTF-8にするには、cp437
としてエンコードする必要がある。
(この現象は、Windowsだけかもしれん。他の環境では未確認)
Pythonの場合、ZIPファイルは自動的にcp437
で開かれるので、ファイル名のみエンコードしてからutf-8
でデコードする。
import zipfile with zipfile.ZipFile(zipPath, 'r') as myzip: infolist = myzip.infolist() for info in infolist: filename_utf_8 = info.filename.encode('cp437').decode('utf-8')
C#の場合は、ZIPファイルを開く時にcp437
を指定し、かつファイル名をcp437
でエンコードしてからutf-8
でデコードする。
using System.IO.Compression; using System.Text; namespace slack2csv { class Class1 { void ReadZip(string zipPath) { var za = ZipFile.Open(zipPath, ZipArchiveMode.Read, Encoding.GetEncoding("cp437")); foreach (var item in za.Entries) { var filename_utf_8 = Encoding.GetEncoding("utf-8").GetString(Encoding.GetEncoding("cp437").GetBytes(item.ToString())); } } } }
参照: