处理UTF-8string

因为我知道linux使用UTF-8编码。 这意味着我可以使用std::string来处理string权利? 只是编码将是UTF-8。

现在在UTF-8上,我们知道一些字符是1个字节,一些2,3 ..字节。 我的问题是:如何在Linux上使用C ++处理UTF-8编码的string?

特别是:如何获得以字节(或字符数)表示的string长度? 你将如何遍历string? 等等

我问的原因是,正如我所说的UTF-8字符可能不止一个字节的权利? 所以显然myString[7]myString[8] – 可能不会引用两个不同的字符。 也就是说UTF-8string是十个字节,对它的字符数目没有太多的说明吧?

Solutions Collecting From Web of "处理UTF-8string"

你不能用std::string处理UTF-8。 string ,尽管它的名字,只是(多)字节的容器。 它不是一种文本存储的类型(超出了字节缓冲区显然可以存储任何对象的事实,包括文本)。 它甚至不存储字符( char是一个字节,而不是一个字符)。

如果你想实际处理 (而不只是存储)Unicode字符,你需要在标准库之外冒险。 传统上,这是由ICU等图书馆完成的。

但是,虽然这是一个成熟的库,但它的C ++接口很糟糕。 Ogonek采取了现代化的方法。 目前尚不完善,仍在进行中,但提供了更好的界面。

可能希望在操作UTF-8编码的字符串之前将其转换为某种固定宽度的编码。 但这取决于你想要做什么。

str.size()为单位获取UTF-8字符串的字节长度。 为了获得字符长度稍微困难一些,但是可以通过忽略字符串中任何大于等于0x80和小于等于0xC0的字节来得到。 在UTF-8中,这些值始终是尾随字节。 所以计算这样的字节数,并从字符串的大小中减去它。

以上做法忽略了字符组合的问题。 它确实取决于你对角色的定义是什么。

这里有多个概念:

  1. UTF-8编码的字节长度
  2. 使用的Unicode代码点数(= 0x80..0xbf范围之外的UTF-8字节数)
  3. 字形的数量(西方语言中的“字符”)
  4. 显示时占用的屏幕空间

通常情况下,你只对1(对于内存需求)和4(对于显示)感兴趣,其他的则没有真正的应用。

可以从渲染上下文中查询屏幕空间量。 请注意,这可能会根据上下文而有所不同(例如,阿拉伯文字母会在词语的开头和结尾处改变形状),所以如果您正在进行文字输入,则可能需要执行额外的技巧来为用户提供一致的体验。

您可以根据第一个字节的主要x位来确定它: UTF-8,说明

我正在使用libunistring库,它可以帮助你处理你所有的问题。

例如,这里是简单的字符串长度(在UTF-8字符)功能:

 size_t my_utf8_strlen(uint8_t *str) { if (str == NULL) return 0; if ((*str) == 0) return 0; size_t length = 0; uint8_t *current = str; // UTF-8 character. ucs4_t ucs_c = UNINAME_INVALID; while (current && *current) { current = u8_next(&ucs_c, current); length++; // Broken character. if (ucs_c == UNINAME_INVALID || ucs_c == 0xfffd) return length - 1; } return length; } // Use case std::string test; // Loading some text in `test` variable. // ... std::cout << my_utf8_strlen(&test[0]) << std::endl;