【问题标题】:Encoding US-ASCII to UTF-8 add space character [closed]将 US-ASCII 编码为 UTF-8 添加空格字符 [关闭]
【发布时间】:2021-10-06 14:51:40
【问题描述】:

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

【问题讨论】:

  • UTF-8 是 ASCII 的超集,因此 ASCII 和 UTF-8 文件之间应该没有区别。请edit问题显示源文件和结果文件中的字节,例如通过复制像xxd这样的工具的输出。
  • space in the only first line - 你的意思是UTF-8 BOMjust one char - 您确定要转换为 UTF-8 而不是 UTF-16
  • 您认为为什么需要转换文件?正如 snakecharmerb 所说,任何有效的 US-ASCII 文件也是有效的 UTF-8,因此不需要转换。如果文件在转换时发生变化(除了在开始时添加额外的“BOM”),那么它不是以 US-ASCII 开头的。
  • @IMSoP 我们将向其发送日志文件的公司希望它为 UTF-8。我会看看这个 UTF-8Bom 的东西。谢谢你的回答。
  • @GSerg 我敢肯定,因为当我运行文件时 -i 命令其输出 UTF-8。感谢您的 UTF-8Bom 建议,我会检查一下

标签: encoding utf-8 ascii iconv


【解决方案1】:

我认为您对什么是字符编码以及 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 来表示,就这样做;如果你不能,就遵循这些额外的规则”开始。

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

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

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

【讨论】:

    猜你喜欢
    • 2012-07-03
    • 2013-08-29
    • 2011-06-20
    • 2021-11-17
    • 1970-01-01
    • 2011-06-26
    • 2020-05-25
    • 1970-01-01
    • 2010-09-22
    相关资源
    最近更新 更多