Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What is going on with this article?
@Kounotori_ssbm

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

More than 1 year has passed since last update.

 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 ファイルをアップロードしてもスニペットにされないまともな方法をご存知でしたら教えて下さい!!

1
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
1
Help us understand the problem. What is going on with this article?