我的 shell 脚本输出中出现 有人可以协助如何从输出中删除这些特殊字符
注意:我将输出存储在 txt 文件中并通过邮件发送输出
答案1

在 ISO8859-1 中编码为 0xef 0xbb 0xbf。
$ printf %s '' | iconv -t ISO8859-1 | hexdump -C
00000000 ef bb bf |...|
00000003
该三个字节的序列也恰好是 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-8 作为 UCS-2LE/BE 或 UTF-16LE/BE 而不是 UTF-16 时,也会发生这种情况:
$ 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。
在第一种情况下,您应该能够通过管道删除 BOM dos2unix
,并修复 Microsoft 文件的其他问题。或者您可以删除该三字节序列的出现sed $'s/\xef\xbb\xbf//g'
(假设 shell 支持这些 ksh-style $'...'
)。
在第二种情况下,虽然您可以删除
带有 的内容sed 's///g'
,但损坏可能不限于该 BOM 字符,最好是通过执行以下操作来反转双 UTF-8 编码:
<your-file iconv -f UTF-8 -t ISO8859-1 | one-of-the-above