14
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Slack に 1MB 以下の BOM 付き CSV をアップロードすると BOM が消える

Last updated at Posted at 2020-02-10

 UTF-8 の CSV を Excel でも文字化けを起こさず開くために、BOM (\uFEFF) を付けた CSV を hubot で Slack にアップロードするものを開発していました。

 アップロードされたファイルをダウンロードして Excel で開くと、なぜか文字化け。調べてみると、なんと BOM が消滅していることに気づきました。
 しかし、必ず起こるわけではなく、別の CSV では消えていません。

 数時間悩み調べた末、解決方法はまだ分かっていないものの、原因は判明しました。
 検索しても同じ現象で悩んでいる人が見つからなかったので、備忘録も兼ねて投稿しておこうと思います。

結論: スニペットに変換されると消える

 Slack は、テキストベースのファイルをアップロードすると、どうやら 1MB 以下のものはスニペット表示をするようです。

 まず、1024KB の BOM 付き CSV ファイルをアップロードしてみます。
image.png
 スニペットとして表示されます。これを少し行を増やして 1025KB にし、1MB を超えると……
image.png
 意図通り、ファイルとしてアップロードされました。
 そしてそれぞれをダウンロードしてみると、前者のスニペット表示された方は BOM が消滅してしまいました。。。

ビミョーな回避策

 あまりちゃんとした方法ではないのですが、なぜか 1MB 以下でもスニペットに変換されずにファイルとしてアップロードできる方法を見つけました。
 その方法とは「ファイルの先頭に BOM を 2 つ書く」です。これでなぜかうまくいきました。

image.png
 上記とおり、エクスプローラ上で 919KB の BOM を 2 つ書いた CSV をアップロードしたら、1MB 以下でもファイルとしてアップロードできました。もちろん、テキストでその CSV を開くと 2 つ目の余分な BOM があるのでかなり気持ちが悪いのですが……。

 なぜなんでしょうか? 最初の \uFEFF は BOM として処理されて、ファイルの最初は実質 2 つ目の \uFEFF ということになり、普通の文字コードじゃないからバイナリファイルか何かと解釈されたんでしょうか? となると、最初の BOM の後は他のものでもいいのかもしれません。

他に試したこと

アップロードのオプション で、filetype に binary とか指定してみてアップロードしましたが、それはダメでした。

お願い

 どなたか、Slack で 1MB 以下の CSV ファイルをアップロードしてもスニペットにされないまともな方法をご存知でしたら教えて下さい!!

14
2
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
14
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?