使用 BOM 来处理 UTF-8 文件的正确方法是什么?

问题描述 投票:0回答:2

我想将多个 UTF-8 文本文件合并在一起,而文件中间不包含多个 BOM。 除了从每个文件中剥离 BOM 之外,还有其他正确的方法吗?

我的问题是,在剥离 BOM 并将文件组合在一起后,我在将数据复制到 Postgres 表时遇到问题。 Postgres 抱怨数据不是 UTF-8。 我可以很好地复制一份带有 BOM 的小型原始文件。 仅删除了所有 BOM 的组合文件就会导致问题。

谢谢。

bash text utf-8 postgresql-9.1
2个回答
2
投票

UTF-8 中不存在字节顺序歧义,因此不需要 BOM。处理 UTF-8 的程序不应该需要这样的东西。如果 BOM 意外出现在 UTF-8 流的开头,则它始终是字节 EF BB BF。从 UTF-8 中删除 BOM 的正确方法是首先检查它是否以这三个字节开头,然后删除这些字节。如果您从不以这三个字节开头的 UTF-8 流中删除三个字节,那么您并没有删除 BOM,并且可能会损坏 UTF-8。


0
投票

将所有文件连接到一个流中并删除除第一行之外的所有 BOM:

cat *.csv | sed '1!s/^\xEF\xBB\xBF//' > result.txt

如果没有 BOM,则不会删除任何内容。您可以使用以下方式检查结果:

cat -A result.txt

BOM 字符

M-oM-;M-?
(由 cat 显示)应仅出现在第一行。

© www.soinside.com 2019 - 2024. All rights reserved.