UTF-8 の CSV を Excel でも文字化けを起こさず開くために、BOM (\uFEFF
) を付けた CSV を hubot で Slack にアップロードするものを開発していました。
アップロードされたファイルをダウンロードして Excel で開くと、なぜか文字化け。調べてみると、なんと BOM が消滅していることに気づきました。
しかし、必ず起こるわけではなく、別の CSV では消えていません。
数時間悩み調べた末、解決方法はまだ分かっていないものの、原因は判明しました。
検索しても同じ現象で悩んでいる人が見つからなかったので、備忘録も兼ねて投稿しておこうと思います。
結論: スニペットに変換されると消える
Slack は、テキストベースのファイルをアップロードすると、どうやら 1MB 以下のものはスニペット表示をするようです。
まず、1024KB の BOM 付き CSV ファイルをアップロードしてみます。
スニペットとして表示されます。これを少し行を増やして 1025KB にし、1MB を超えると……
意図通り、ファイルとしてアップロードされました。
そしてそれぞれをダウンロードしてみると、前者のスニペット表示された方は BOM が消滅してしまいました。。。
ビミョーな回避策
あまりちゃんとした方法ではないのですが、なぜか 1MB 以下でもスニペットに変換されずにファイルとしてアップロードできる方法を見つけました。
その方法とは「ファイルの先頭に BOM を 2 つ書く」です。これでなぜかうまくいきました。
上記とおり、エクスプローラ上で 919KB の BOM を 2 つ書いた CSV をアップロードしたら、1MB 以下でもファイルとしてアップロードできました。もちろん、テキストでその CSV を開くと 2 つ目の余分な BOM があるのでかなり気持ちが悪いのですが……。
なぜなんでしょうか? 最初の \uFEFF
は BOM として処理されて、ファイルの最初は実質 2 つ目の \uFEFF
ということになり、普通の文字コードじゃないからバイナリファイルか何かと解釈されたんでしょうか? となると、最初の BOM の後は他のものでもいいのかもしれません。
他に試したこと
アップロードのオプション で、filetype
に binary とか指定してみてアップロードしましたが、それはダメでした。
お願い
どなたか、Slack で 1MB 以下の CSV ファイルをアップロードしてもスニペットにされないまともな方法をご存知でしたら教えて下さい!!