【问题标题】:UTF-8, Unicode and how does machine interprete bytes?UTF-8、Unicode 以及机器如何解释字节?
【发布时间】:2017-09-09 11:40:58
【问题描述】:

我意识到以下几点:

  1. Unicode 字符最多可以表示为 4 个字节的序列。因此,如果一个字符用两个或多个字节表示 - 字节排序 对于 BEM 或 LEM 很重要
  2. UTF-8 将字节逐字节写入文件/网络流(不是多字节写入或读取),这意味着如果一个字符是 以两个或多个字节表示,在编码时它写入一个字节 时间。那么在总是解码时,BEM 或 LEM 并不重要 正确读回字节并且在写入时不交换它们或 读。
  3. UTF-16 或 UTF-32 在编码时总是使用两个或四个字节,因此 LEM 或 BEM 现在真的很重要,因为多字节读/写。
  4. 此外,我了解 UTF-8 在读取文件(解码)时如何知道将字节解释为字符。

所以。这是一个例子:

我在 C++ 中将 String 变量声明并初始化为 "ANФГ"
问题。

  1. 在 C++ 中,char 是单字节字符数据类型。 String 类基于 C++ 中的 char[]
  2. 我可以这样声明一个字符串变量吗? UTF-8 编码是默认的吗?
  3. 我决定将此字符串写入文件。该字符串应表示为 A - 一个字节,B - 一个字节,Ф - 两个字节序列,Г - 两个字节序列。它将如何存储在 String 和文件中?这 6 个字节的地址是什么?
  4. 如何从有关 BEM 和 LEM 的文件中读取它? C++ 知道这些字节存储在内存中的地址顺序吗?

EDIT_1:我不明白一件事。如果我有三个字节: - 1000 1111 - 1100 0000 - 0100 0000 第一个和第二个代表 UTF-8 中的一个字符,第三个也代表一个。 字节的顺序是我上面写的。 每个字节都有自己的地址,对吧? 但是当多字节写入发生时,两个字节存储在一个地方?我的意思是,任何输出流都按从左到右的顺序写入数据?那么它也会从左到右读回吗?因为 LEM 或 BEM 交换字节......但是当它是多字节写入时。但是当我们一次只写一个字节时,它有他自己的从左到右的正确顺序吗?

【问题讨论】:

  • 这些问题已被多次回答。简而言之,std::string 是一个字节序列。它不知道编码,你应该像对待它一样对待它。 C++ 的优点和缺点之一是它不强制使用任何默认编码。

标签: c++ c unicode utf-8 endianness


【解决方案1】:
  1. 是的,std::string(或者更确切地说,std::basic_string<char>)使用char 来存储其数据。它与编码无关,因此如果您调用size(),您将获得代表字符串的chars 的实际数量,而不是字符或代码点的数量。
  2. 不,字符串文字的编码是实现定义的。从 C++11 开始,您可以使用 u8 前缀来获取 UTF-8 string literals(例如 u8"ANФГ")。
  3. 如果您一直使用 UTF-8 字符串文字,std::string 将包含 UTF-8,并且如果您使用例如 UTF-8 将被写入文件。 operator<<().
  4. C++ 不会跟踪您的文件恰好包含的任何字符编码(因此也不会跟踪其字节顺序)。如果你碰巧使用的是 UTF-8 端到端,那么字节序就无关紧要了,因为 UTF-8 is endianness-independent

【讨论】:

  • 您的第二点跳过了关于源文件编码以及编译器如何解释的重要部分。在编译器没有任何有用的源文件编码解释的情况下,前缀仅用于翻译例如"\u024D" 转换为正确的 UTF-8 格式。标准中没有将仅在源代码中转储特殊字符描述为正确声明 unicode 字符串文字的实际方法。
猜你喜欢
  • 2021-12-12
  • 2015-04-29
  • 1970-01-01
  • 2015-10-08
  • 2015-07-20
  • 1970-01-01
  • 2011-06-05
  • 2013-07-27
  • 2021-03-12
相关资源
最近更新 更多