将 US-ASCII 编码为 UTF-8 添加空格字符

问题描述

我正在尝试将一些日志文件从 US-ASCII 编码为 UTF-8 我为此使用了 iconv。 当我编码 utf-8 时,唯一的第一行中有一个空格,只有一个字符。 我尝试使用 sed 但它使服务器中的格式为 US-ASCII。当我将其转换为 UTF-8 时,又出现了一个空格。 我希望我能够解释我的问题。

解决方法

我认为您对什么是字符编码以及 ASCII 和 UTF-8 之间的关系存在误解。当我们在计算机中存储文本时,我们必须根据一些代码将其转换为二进制序列——我们可以选择诸如“0001 表示 A,0010 表示 B”等。为了同意我们使用的代码,我们给它们命名,例如“ASCII”和“UTF-8”。

如果你查看一个二进制字符串,你无法知道它的作者使用的是什么代码;您能做的最好的事情就是通过尝试不同的代码并查看哪些代码有意义来猜测。但是一些位串在多个代码中有意义 - 并且,对于这个问题至关重要,它们可能在多个代码中完全相同。例如,两个代码可能都说 0001 是 A,但一个代码说 1110 表示“?”另一个意思是“!”。如果您只有一长行 A,那么无论您使用哪种代码,它的编写方式都将完全相同。

就 UTF-8 和 ASCII 而言,这并非巧合; UTF-8 是有意设计的,因此使用 ASCII 编写的任何内容在使用 UTF-8 编写时都具有完全相同的表示。 UTF-8 的定义基本上始于“如果你能用 ASCII 表示它,就这样做;如果你不能,遵循这些额外的规则”。

使用不同的类比,假设客户要求您确保文本是英式英语,而不是美式英语 - “颜色”而不是“颜色”,等等。如果您要发送的文本是“今天下雨”,则无需更改任何内容 - 完全相同的字符串同时是美式英语和英式英语。

如果您的文本包含不能用 ASCII 表示的字符,那么它就不是 ASCII。在这种情况下,您需要知道它实际采用的编码 - 有许多编码,如 UTF-8,旨在与 ASCII 兼容,因此无论您尝试哪种编码,大多数字符都是相同的。 ISO 8859-1 及其表亲 Windows-1252 非常常见; ISO 8859-15 在欧洲可能更是如此;世界其他地方的其他人,他们在编写当地语言时很有用。

您在文件开头看到的额外“空格”可能是所谓的“字节顺序标记”,这是一个 Unicode 字符,故意定义为没有任何意义,但在不同的编码中有不同的表示。它是为了给想要猜测一段文本中使用的编码的程序提供一个提示,但这不是强制性的,并且该字符串在添加之前已经是有效的 UTF-8。