我刚刚意识到,u8C++ 17 的字符前缀不适用于所有 utf8代码点,仅适用于ASCII部分.
UTF-8字符文字,例如
u8'a'.这样的文字具有类型char和值等于c-char的ISO 10646代码点值,前提是代码点值可用单个UTF-8代码单元表示.如果c-char不在Basic Latin或C0 Controls Unicode块中,则程序格式错误.
auto hello = u8'?'; // ill-formed
auto world = u8"?"; // not a character
auto what = 0xE7958C; // almost human-readable
auto wrong = u8"?"[0]; // not even correct
Run Code Online (Sandbox Code Playgroud)
如何在utf8中简洁地获得代码点文字?
编辑:对于想知道如何存储utf8代码点的人们来说,我认为合理的方式就像Golang一样.基本思想是当只需要一个代码点时,以32位类型存储单个代码点.
编辑2:从有用的评论中提出的论点,没有理由将utf8编码一直保持在32位类型中.要么解码,要么是utf32并且具有前缀U,或者使用前缀将其编码为字符串u8.
如果你想要一个代码点,那么你应该使用char32_t和U作为前缀:
auto hello = U'?';
Run Code Online (Sandbox Code Playgroud)
UTF-8将代码点存储为8位代码单元的序列.charC++中的A 是代码单元,因此它不能存储整个Unicode代码点.u8如果提供需要存储多个代码单元的代码点,则字符文字的前缀不会编译,因为字符文字只生成一个char.
如果您想要一个以UTF8编码的单个Unicode代码点,那么您想要的是字符串文字,而不是字符文字:
auto hello = u8"?";
Run Code Online (Sandbox Code Playgroud)
我认为合理的方式就像Golang那样做.
好吧,你没有使用Go,是吗?
在C++中,如果要求字符文字,则表示该大小类型的单个对象.一个u8文字将永远是一个char.它的类型不会根据文字中的内容而变化.你问了一个字符文字,你得到一个字符文字.
从您链接到的网站,很明显Go实际上根本没有UTF-8字符文字的概念.它只有字符文字,所有字符都是32位值.实际上,Go中的所有字符文字都表现得像U''.
| 归档时间: |
|
| 查看次数: |
850 次 |
| 最近记录: |