【发布时间】:2017-09-09 11:40:58
【问题描述】:
我意识到以下几点:
- Unicode 字符最多可以表示为 4 个字节的序列。因此,如果一个字符用两个或多个字节表示 - 字节排序 对于 BEM 或 LEM 很重要
- UTF-8 将字节逐字节写入文件/网络流(不是多字节写入或读取),这意味着如果一个字符是 以两个或多个字节表示,在编码时它写入一个字节 时间。那么在总是解码时,BEM 或 LEM 并不重要 正确读回字节并且在写入时不交换它们或 读。
- UTF-16 或 UTF-32 在编码时总是使用两个或四个字节,因此 LEM 或 BEM 现在真的很重要,因为多字节读/写。
- 此外,我了解 UTF-8 在读取文件(解码)时如何知道将字节解释为字符。
所以。这是一个例子:
我在 C++ 中将 String 变量声明并初始化为 "ANФГ"。
问题。
- 在 C++ 中,
char是单字节字符数据类型。String类基于 C++ 中的char[]? - 我可以这样声明一个字符串变量吗? UTF-8 编码是默认的吗?
- 我决定将此字符串写入文件。该字符串应表示为 A - 一个字节,B - 一个字节,Ф - 两个字节序列,Г - 两个字节序列。它将如何存储在 String 和文件中?这 6 个字节的地址是什么?
- 如何从有关 BEM 和 LEM 的文件中读取它? C++ 知道这些字节存储在内存中的地址顺序吗?
EDIT_1:我不明白一件事。如果我有三个字节: - 1000 1111 - 1100 0000 - 0100 0000 第一个和第二个代表 UTF-8 中的一个字符,第三个也代表一个。 字节的顺序是我上面写的。 每个字节都有自己的地址,对吧? 但是当多字节写入发生时,两个字节存储在一个地方?我的意思是,任何输出流都按从左到右的顺序写入数据?那么它也会从左到右读回吗?因为 LEM 或 BEM 交换字节......但是当它是多字节写入时。但是当我们一次只写一个字节时,它有他自己的从左到右的正确顺序吗?
【问题讨论】:
-
这些问题已被多次回答。简而言之,std::string 是一个字节序列。它不知道编码,你应该像对待它一样对待它。 C++ 的优点和缺点之一是它不强制使用任何默认编码。
标签: c++ c unicode utf-8 endianness