如何在utf8中获取代码点文字

Pas*_* By 5 c++ utf-8 c++17

我刚刚意识到,u8C++ 17 的字符前缀不适用于所有 utf8代码点,仅适用于ASCII部分.

来自cppreference

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.

Nic*_*las 7

如果你想要一个代码点,那么你应该使用char32_tU作为前缀:

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''.

  • @PasserBy:我不确定那是重要的.您要么需要Unicode代码点值,要么需要UTF-8*字符串*(又称:多个代码单元的序列).那么,你想要哪个? (3认同)