如何将文件从 ASCII 转换为 UTF-8?
Posted
技术标签:
【中文标题】如何将文件从 ASCII 转换为 UTF-8?【英文标题】:How to convert a file from ASCII to UTF-8? 【发布时间】:2015-04-07 10:43:02 【问题描述】:我正在尝试将一堆文件从 ASCII 转码为 UTF-8。
为此,我尝试使用iconv
:
iconv -f US-ASCII -t UTF-8 infile > outfile
-f ENCODING
输入的编码
-t ENCODING
输出的编码
该文件仍然没有转换为 UTF-8。它是一个 .dat 文件。
在发布之前,我搜索了谷歌并找到了如下信息:
ASCII 是 UTF-8 的一个子集,因此所有 ASCII 文件都已经是 UTF-8 编码的。 ASCII 文件中的字节和“将其编码为 UTF-8”产生的字节将是完全相同的字节。它们之间没有区别。
Force encode from US-ASCII to UTF-8 (iconv)
Best way to convert text files between character sets?
以上链接仍然没有帮助。
即使是ASCII码也支持UTF-8,因为UTF-8是一个超集,接收我文件的对方需要文件编码为UTF-8。他只需要UTF-8的文件格式。
请有任何建议。
【问题讨论】:
根本不清楚问题出在哪里 - 只需将原始 ASCII 文件提供给此人即可。如果它们是真正的 ASCII,它们已经是 UTF-8,所以它们应该没问题。究竟出了什么问题? @Jon Skeet 对方期望文件格式为 UTF-8,当我尝试使用命令 file -i outfile 它返回 ascii 但他们严格希望它为 utf-8。尽管 ascii 是 utf-8 的子集。 如果它是真正的 ASCII,它是“严格的 UTF-8”。根据您的评论,如果对方因为file
的输出而拒绝 ASCII 文件,那么听起来对方基本上是坏了。他们应该接受 ASCII 文件是 UTF-8 文件,并继续处理它。
@JonSkeet 在没有更多细节的情况下,我倾向于同意。可能值得建议和鼓励他们接受来自“文件”的两个回复。他们的 API 将更加灵活和健壮,他们将不必与使用它的其他人反复进行精确的讨论。如果他们不能或不愿意这样做,那么至少在他们的文档中非常明确地声明输入文件中需要 BOM,使用这种精确的语言,也可能会有很长的路要走。
【参考方案1】:
我对这个问题有点困惑,因为正如您所说,ASCII 是 UTF-8 的子集,所以所有 ASCII 文件都已经是 UTF-8 编码的。
如果您向对方发送仅包含 ASCII 字符的文件,但对方抱怨它们不是“UTF-8 编码”,那么我猜他们指的是ASCII 文件没有明确指示内容为 UTF-8 的字节顺序标记。
如果确实如此,那么您可以使用此处的答案添加字节顺序标记:
iconv: Converting from Windows ANSI to UTF-8 with BOM
如果对方表示他不需要'BOM'(字节顺序标记),但仍然抱怨文件不是UTF-8,那么另一种可能是你的初始文件实际上不是ASCII,而是而是包含使用 ANSI 或 ISO-8859-1 编码的字符。
编辑添加以下实验,在 Ram 评论对方使用“文件”命令寻找类型之后
Tims-MacBook-Pro:~ tjohns$ echo 'Stuff' > deleteme
Tims-MacBook-Pro:~ tjohns$ cat deleteme
Stuff
Tims-MacBook-Pro:~ tjohns$ file -I deleteme
deleteme: text/plain; charset=us-ascii
Tims-MacBook-Pro:~ tjohns$ echo -ne '\xEF\xBB\xBF' > deleteme
Tims-MacBook-Pro:~ tjohns$ echo 'Stuff' >> deleteme
Tims-MacBook-Pro:~ tjohns$ cat deleteme
Stuff
Tims-MacBook-Pro:~ tjohns$ file -I deleteme
deleteme: text/plain; charset=utf-8
【讨论】:
嗨@Timothy Johns。谢谢你的解释。另一方正在使用 file -i outfile 检查文件格式,它在那里返回 ascii,他们希望将其作为 utf-8 为他们进一步处理。 @Ram 在这种情况下,我大约 98% 确定对方正在寻找字节顺序标记。在 Mac OS 上,'file' 将输出 "text/plain; charset=utf-8" 如果存在,则输出 "text/plain; charset=us-ascii" 如果不存在。我将编辑上面的答案以添加实验。 嗨 @Timothy Johns 我在 Linux 环境中工作。他们要求 UTF-8 的原因是他们希望支持更多 ASCII 中不可用的字符。请注意,这一切都是为了处理 Hadoop(数据世界)中的数据。 嗨@Timothy Johns。感谢您的所有投入。我尝试使用以下命令并将 ASCII 文件转换为 UTF-8 格式。 (printf "\357\273\277";cat 输入文件) > 输出文件;当我给 ASCII 输入文件时,它返回给我 UTF-8 输出文件。以上是关于如何将文件从 ASCII 转换为 UTF-8?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Java 中将 UTF-8 转换为 US-Ascii