C++ UTF-8 实际字符串长度

Posted

技术标签:

【中文标题】C++ UTF-8 实际字符串长度【英文标题】:C++ UTF-8 actual string length 【发布时间】:2013-05-31 18:51:46 【问题描述】:

在任何标准库中是否有任何本机(跨平台)C++ 函数返回std::string 的实际长度?

更新: 正如我们所知,std::string.length() 返回的是字节数而不是字符数。 我已经有一个返回实际函数的自定义函数,但我正在寻找一个标准函数。

【问题讨论】:

您可能会发现有趣的答案here。但是请注意,正如@BenVoigt 指出的那样,C++11 现在有了实现它的标准方法。 @syam:同意,但答案在过去 3 年发生了变化。此外,此问题专门要求标准提供的功能,而不是自定义实现,这是您在其他问题的答案中找到的全部内容。 @BenVoigt:我刚看到你的回答,不知道这是 C++11 的一部分。不过,其他问题的答案可能仍然很有趣,我将改写我的评论。 "character" 有点模棱两可。取决于你真正想要什么,答案会变得更加复杂。您想要计算 Unicode 码位吗?字素簇的计数(包括组合字符的“可见”字形,我们在屏幕上阅读时会考虑单个字符)?像零宽度空间这样的不可见代码点呢? @BenVoigt 是的。我的观点是,该接口仍然是旧的、笨拙的 C++03 接口,带有charT*,没有迭代器,也不支持std::string 【参考方案1】:

codecvt 应该会有所帮助,标准提供了 UTF-8 的实现,例如 codecvt_utf8<char32_t>() 在这种情况下是合适的。

大概是这样的:

wstring_convert< codecvt_utf8<char32_t>, char32_t >().from_bytes(the_std_string).size()

【讨论】:

【参考方案2】:

实际长度是字节数。计算代码点没有什么意义。您可能想计算其他事物,例如字形簇。

在http://utf8everywhere.org中查看更多关于不同类型字符串长度的信息

【讨论】:

【参考方案3】:

没有第三方库,在 C/C++ 中无法做到这一点。 即使您转换为 char32_t,您也会得到代码点,而不是字符。

由于分解格式、连字、变体选择器等原因,代码点与用户对字符的感知不匹配。

最接近“用户角色”的可用构造是“字素簇” (见http://www.unicode.org/reports/tr29/)

您最好的跨平台选择是 ICU4C (http://site.icu-project.org/)

【讨论】:

以上是关于C++ UTF-8 实际字符串长度的主要内容,如果未能解决你的问题,请参考以下文章

MTProto字符串类型:长度是以字节为单位还是UTF-8字符串长度?

C++基础求教,如何限制字符串长度

c++如何获取字节BYTE的长度?

特定长度的 C++ 字符串

从长度为无符号整数的 ByteBuffer 中读取 UTF-8 字符串

c++字符串长度函数