物理の駅 Physics station by 現役研究者

テクノロジーは共有されてこそ栄える

SlackからエクスポートしたZIPファイル内のファイルパスの文字化けを修正する

いつからか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()));
            }
        }
    }
}

参照:

www.lifewithpython.com