UTF-8,Unicode以及机器如何解释字节?

时间:2017-04-13 11:13:34

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

我已经意识到以下几点:

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

因此。这是一个例子:

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

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

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

1 个答案:

答案 0 :(得分:1)

  1. 是的,std::string(或更确切地说,std::basic_string<char>)使用char来存储其数据。它与编码无关,因此如果您例如调用size(),您将获得表示字符串的实际char个数,而不是字符数或代码点数。
  2. 不,字符串文字的编码是实现定义的。从C ++ 11开始,您可以使用u8前缀来获取UTF-8 string literals(例如u8"ANФГ")。
  3. 如果您始终使用UTF-8字符串文字,则std::string将包含UTF-8,如果您使用的是UTF-8,则会将UTF-8写入文件。 operator<<()
  4. C ++不会跟踪您的文件所处的任何字符编码(因此也不会跟踪其字节序)。如果您恰好使用UTF-8端到端,则自UTF-8 is endianness-independent以来,字节顺序无关紧要。