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字符串长度?