c++ - 为什么 u8'A' 可以是 char 类型,而 UTF-8 最多可以是 4 个字节,而 char 通常是 1 个字节?
问题描述
我在读wchar_t 在一般编程中有什么用?并在接受的答案中发现了一些令人困惑的地方:
使用可变宽度编码的 char 更为常见,例如 UTF-8 或 GB 18030。
我从我的教科书中找到了这个:
UTF-8的Unicode编码不是最多4个字节吗?char
对于大多数平台来说是 1 个字节。我误解了什么吗?
更新:
经过搜索和阅读,现在我知道了:
- 代码点和代码单元是不同的东西。代码点是唯一的,而代码单元依赖于编码。
- u8'a'(a char, not string) 只允许用于基本字符集(ASCII 和它的控制字符的东西),它的值是对应的 'a' 的代码单元值,对于 ascii 字符,代码单位与代码点的值相同。(这就是@codekaizer的回答所说的)
std::string::size()
返回代码单元。
所以编辑们都在处理代码单元,对吧?如果我将文件编码从 utf8 更改为 uft32,那么 size ofə
会是4吗?
解决方案
utf8的unicode编码不是最多4个字节吗?
根据lex.ccon/3,强调我的:
以 u8 开头的字符文字,例如 u8'w',是 char 类型的字符文字,称为 UTF-8 字符文字。UTF-8 字符文字的值等于其 ISO 10646 代码点值,前提是代码点值可以用单个 UTF-8 代码单元表示(也就是说,只要它在 C0 控件和基本拉丁 Unicode 中堵塞)。如果该值不能用单个 UTF-8 代码单元表示,则程序是ill-formed。包含多个 c 字符的 UTF-8 字符文字是ill-formed。
单个 UTF-8 代码单元为 1 个字节。
推荐阅读
- flutter - 当我“运行”时,它会在 Flutter 中出现错误。附照片
- python - 保存时使用 Python PIL“质量”参数时,PNG 文件大小是否应该保持静态?
- python - 文本文件中的重复行
- algorithm - 保存向前和向后滚动的元素序列的最佳方法是什么?
- javascript - 如何检查数组结果中的字段
- python - 在创建解决 x^2 + y^2 = n 时的解决方案的代码时遇到问题,其中 n 是输入
- jprofiler - Docker/Kubernetes 中的 JProfiler 启动错误
- java - 如何在纯 Java 中实现类似 htop 的接口,如果不可行,为什么?
- r - dplyr 可以在 join 操作后自动生成带有合并结果的列吗?
- javascript - Vue.createApp 不工作,但正在使用新的 Vue() 方法