332


テキストファイルをエクセルにインポートする時、最初のセルに「�ｿ」の文字化けがでてきます。

テキストファイルの例文（Mac OSXのTextEditで見た場合）：

[code]

    0dd6b4f419f3489a580846fb4ebe831b|one: [$numVotes$ more votes needed]
    0dd6b4f419f3489a580846fb4ebe831b|other: [$numVotes$ more votes needed]
    89e050644a71fbf8170e280f59fb8940: An error occurred during submission
    a4c510816f6c806507bb528c240ed9a9: [closed]
    2de9c2314772731359c387be3656bc19: Are you sure you want to award your bounty to this answer? THIS CANNOT BE UNDONE!
    
[/code]

複数のテキストファイルで同じ文字が現れてきます。手で治すには時間がかかりますので、自動的に方法がありますか？


CC BY-SA 3.0
2014-11-17T06:48:55.830
167
2014-12-16T05:56:22.837
2014-11-20T04:39:31.293
10
10
question
テキストファイル sed
テキストファイルの最初4文字の文字化け


各行が「�ｿ」+「ascii文字列」というパターンであることが確定しているなら、「行の先頭からascii文字列以外を削除する」というパターンで除去することができます:

[code]

    $ sed -i.bak 's/^[^[:alnum:]]*//' weird_*.txt
    
[/code]

テスト:

[code]

    $ echo -n -e "\xef\xbf\xbd\xef\xbd\xbf0dd" | sed '1 s/^[^[:alnum:]]*//' | hexdump -C
    00000000  30 64 64 0a                                       |0dd.|
    00000004
    # 一文字増えているのは、sedが改行文字を最後に付加しているせい
    
[/code]

文字化けしているバイト列をピンポイントで除去したい場合、Mac OS X の場合 gsed (GNU sed) でできます。バイト列をまず確認し:

[code]

    $ echo -n -e "\xef\xbf\xbd\xef\xbd\xbf0dd" > weird.txt # テストファイルを作成
    $ head -n1 weird.txt | hexdump -C # バイト列を確認
    00000000  ef bf bd ef bd bf 30 64  64                       |......0dd|
    00000009
    
[/code]

置き換える:

[code]

    # homebrewなどでgsedをインストール
    $ gsed -i.bak 's/^\xef\xbf\xbd\xef\xbd\xbf//' weird.txt
    $ cat weird.txt
    0dd
    
[/code]


CC BY-SA 3.0
2014-11-20T15:10:24.143
176
2014-11-20T15:10:24.143
30
167
answer


おそらく、バイトオーダーマーク(BOM)のついたエンコーディングになっているのだとおもいます。バイトオーダーマークについて詳しくは以下を参照してください。

[バイトオーダーマーク -
Wikipedia](http://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E3%82%AA%E3%83%BC%E3%83%80%E3%83%BC%E3%83%9E%E3%83%BC%E3%82%AF)

UTF-16エンコーディングだと、プラットフォームによってエンディアンの違いが問題となるため、ファイルの先頭にエンディアンを識別するためのデータが追加されることがあります。そのデータのことをバイトオーダーマーク(BOM)といいます。

UTF-8エンコーディングはエンディアンの問題がないため、通常はBOMが付いていません。Mac OS
Xなどで普通に「UTF-8」といえば「BOMなしUTF-8」となります。ただし、Unicodeの仕様としてはUTF-8にもBOMをつけることが許されていてその場合は「0xEF
0xBB 0xBF」が付加されます。

特に、Windows環境ではUTF-8にもBOMをつける傾向が多いようで、Windowsのメモ帳でUTF-8を選択して保存するとBOM付きUTF-8のファイルになります。

<http://www.php-factory.net/trivia/03.php>

今回の問題はMac版の
ExcelがBOMありのUTF-8に対応していないのが原因だとおもいます。Microsoftの製品なんだから対応して欲しいところですが、仕方ないので
テキストファイルの方を直すしかありません。

UNIXでの文字エンコーディングの変換は通常 iconv を使うのですが、iconvは BOMありのUTF-8に対応していないという問題があります。

<http://yanok.net/2010/02/iconvutf-8bom.html>

ちょっと古いツールですが、昔ながらの nkf を使うとBOMの変更操作も可能です。nkfは homebrew等でインストール可能です。

[code]

    >brew install nkf
    
[/code]

nkfでBOMを削除するには以下のようにします。

[code]

    >nkf --overwrite --oc=UTF-8 test.txt
    
[/code]

逆に、BOMを追加する場合は、以下のようにします。

[code]

    >nkf --overwrite --oc=UTF-8-BOM test.txt
    
[/code]


CC BY-SA 3.0
2014-12-04T01:07:50.787
332
2014-12-04T09:10:43.583
2014-12-04T09:10:43.583
832
832
167
answer


Excel(Mac)がBOM付きUnicodeに対応していないのが問題だと思います。GUIツールだとCotEditor(Mac)でBOMの除去ができます。

  1. CotEditorでファイルを開く
  2. メニュー -> フォーマット -> エンコーディング -> Unicode (UTF-16) を選択
  3. ファイルを保存

![画像の説明をここに入力](https://i.stack.imgur.com/e8s2q.jpg)


CC BY-SA 3.0
2014-12-04T09:48:47.487
354
2014-12-04T09:48:47.487
37
167
answer


BOM が付いているからというのが正解のようですが、何者かを確認できていたら解決が楽だった可能性があるので、それを調べる方法をどうぞ。

[code]

    $ head -n1 target.txt |od -tcx1
    
[/code]

こんな風にすると、ファイル先頭部分の文字コードを確認できます。`od`(1) の代わりに `hexdump`(1) などを利用してもいいですね。


CC BY-SA 3.0
2014-12-16T05:56:22.837
1683
2014-12-16T05:56:22.837
3061
167
answer