我想将多个 UTF-8 文本文件合并在一起,而文件中间不包含多个 BOM。 除了从每个文件中剥离 BOM 之外,还有其他正确的方法吗?
我的问题是,在剥离 BOM 并将文件组合在一起后,我在将数据复制到 Postgres 表时遇到问题。 Postgres 抱怨数据不是 UTF-8。 我可以很好地复制一份带有 BOM 的小型原始文件。 仅删除了所有 BOM 的组合文件就会导致问题。
谢谢。
UTF-8 中不存在字节顺序歧义,因此不需要 BOM。处理 UTF-8 的程序不应该需要这样的东西。如果 BOM 意外出现在 UTF-8 流的开头,则它始终是字节 EF BB BF。从 UTF-8 中删除 BOM 的正确方法是首先检查它是否以这三个字节开头,然后删除这些字节。如果您从不以这三个字节开头的 UTF-8 流中删除三个字节,那么您并没有删除 BOM,并且可能会损坏 UTF-8。
将所有文件连接到一个流中并删除除第一行之外的所有 BOM:
cat *.csv | sed '1!s/^\xEF\xBB\xBF//' > result.txt
如果没有 BOM,则不会删除任何内容。您可以使用以下方式检查结果:
cat -A result.txt
BOM 字符
M-oM-;M-?
(由 cat 显示)应仅出现在第一行。