如何将文件从ASCII转换为UTF-8?

6

我想将一堆ASCII编码的文件转换成UTF-8编码。

为此,我尝试使用iconv

iconv -f US-ASCII -t UTF-8 infile > outfile

-f ENCODING 指定输入的编码格式

-t ENCODING 指定输出的编码格式

即便是在ASCII编码下,这个文档还是不能转换成UTF-8。它是一个.dat文件。

在发布此问题前,我在Google上搜索并发现了以下信息:

ASCII是UTF-8的子集,因此所有ASCII文件都已经以UTF-8编码。 在ASCII文件中的字节和“将其编码为UTF-8”会得到完全相同的字节。 它们之间没有区别。

强制将US-ASCII编码转换为UTF-8 (iconv)

最佳文本文件字符集转换方式?

但是以上链接都没有帮到我。

即便是在ASCII编码下,它也支持UTF-8,因为UTF-8是其超集。 我将要向其他人发送这些文件,他需要文件编码为UTF-8。 他只需要文件格式为UTF-8。

请提供任何建议。


1
问题并不明确,只需将原始ASCII文件交给该人。如果它们是真正的ASCII,则它们已经是UTF-8,因此应该没问题。实际上出了什么问题? - Jon Skeet
@Jon Skeet,另一方期望文件格式为UTF-8。当我尝试使用命令“file -i outfile”时,它返回的是ASCII,但他们严格要求使用UTF-8。即使ASCII是UTF-8的子集。 - Ram
4
如果一个文件是真正的ASCII,则它就是“UTF-8严格”的。根据您的评论,如果对方因为file输出而拒绝ASCII文件,那么他们基本上是有问题的。他们应该接受ASCII文件是UTF-8文件,并继续处理它。请注意,这里没有更改原始含义,只是使语言更通俗易懂。 - Jon Skeet
在缺乏更多细节的情况下,我倾向于同意@JonSkeet的观点。建议并鼓励他们接受来自“文件”的两个响应可能是值得的。这将使他们的API更加灵活和健壮,并且他们将避免不断地与其他使用它的人进行这种确切讨论。如果他们无法或不愿意这样做,那么在他们的文档中非常明确地说明输入文件需要BOM,使用那种精确的语言,可能也会有很大帮助。 - Timothy Johns
1个回答

19

对于这个问题,我有些困惑,因为正如你所指出的那样,ASCII是UTF-8的子集,因此所有ASCII文件都已经是UTF-8编码了。

如果你将只包含ASCII字符的文件发送给他人,但是对方抱怨它们没有“UTF-8编码”,那么我猜他们指的是ASCII文件没有字节顺序标记(BOM)明确表示其内容是UTF-8。

如果确实是这种情况,那么你可以使用这里的答案添加一个字节顺序标记:

iconv:将Windows ANSI转换为带BOM的UTF-8

如果对方表示他不需要“BOM”(字节顺序标记),但仍然抱怨文件不是UTF-8,则另一个可能性是你的初始文件实际上不是ASCII,而是包含使用ANSI或ISO-8859-1编码的字符。

在Ram提到对方使用“file”命令查找类型后,编辑以添加以下实验

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
1
在这种情况下,我大约有98%的把握认为对方正在寻找字节顺序标记。在Mac OS上,如果有字节顺序标记,“file”将输出“text/plain; charset=utf-8”,如果没有,则输出“text/plain; charset=us-ascii”。我将编辑上面的答案以添加一个实验。 - Timothy Johns
嗨@Timothy Johns,我正在Linux环境下工作。他们要求使用UTF-8的原因是他们想要支持一些在ASCII中不可用的字符。请注意,所有这些都是为了在Hadoop(数据世界)中处理数据。 - Ram
嗨,@Timothy Johns。感谢您的所有输入。我尝试使用以下命令将ASCII文件转换为UTF-8格式。(printf "\357\273\277";cat inputfile) > outputfile; 当我给出ASCII inputfile时,它会返回UTF-8 outputfile。 - Ram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接