がシェルスクリプト出力に表示されます。誰かが出力からこれらの特殊文字を削除する方法を助けることができますか?
注:出力をtxtファイルに保存し、メールで出力を送信します。
答え1

ISO8859-1では、0xef 0xbb 0xbfにエンコードされています。
$ printf %s '' | iconv -t ISO8859-1 | hexdump -C
00000000 ef bb bf |...|
00000003
この3バイトシーケンスは、U + FEFF ZERO WIDTH NO-break SPACE改行なしの空白文字のUTF-8エンコーディングでもあります。
$ printf %s $'\ufeff' | iconv -t UTF-8 | hexdump -C
00000000 ef bb bf |...|
00000003
U+FEFF 文字は次のように使用されます。バイト順表示(BOM)をUTF-16として使用します。 UTF-8では意味がありませんが、Microsoftのテキストファイルではこれらの内容を見ることができます(参照:UTF-8ファイルからBOMを削除するには?)。
これは、一部のUTF-16でエンコードされたテキストがUTF-16ではなくUCS-2LE / BEまたはUTF-16LE / BEでUTF-8にデコードされている場合にも発生します。
$ printf X | iconv -t UTF-16 | iconv -f UTF-16LE -t UTF-8 | hexdump -C
00000000 ef bb bf 58 |...X|
00000004
これにはUTF-8でエンコードされたBOMがあり、ディスプレイデバイスではテキストがISO8859-1でエンコードされてレンダリングされると仮定するか、デュアル
UTF-8エンコーディングがあります。つまり、テキストはすでにUTF-8でエンコードされていますが、誰かがISO8859-1と考えてUTF-8で再エンコードします。
dos2unix
最初のケースでは、パイプを介してBOMを削除し、Microsoftファイルに関するその他の問題を解決できます。あるいは、この3バイトシーケンスの発生を排除することもできますsed $'s/\xef\xbb\xbf//g'
(シェルがこれらのkshスタイルをサポートしていると仮定$'...'
)。
2番目のケースでは、BOM文字
を含むコンテンツを削除できますが、sed 's///g'
ダメージはこれに限定されない可能性があるため、次の手順を実行してデュアルUTF-8エンコーディングを反転することをお勧めします。
<your-file iconv -f UTF-8 -t ISO8859-1 | one-of-the-above