查找std :: wstring的字符长度

时间:2011-08-21 08:52:57

标签: c++ unicode

我正在使用std :: wstring变量(C ++语言)&我试图确定字符串的长度(以字符为单位)。

功能.length& .size()给出的结果不是字符的长度(我想他们告诉我有多少宽字符?)。

那么有没有办法确定wstring的字符长度?

4 个答案:

答案 0 :(得分:6)

“字符”是什么意思?

std::basic_string只是一系列值的容器,我们认为它是一个字符串。它不关心值是什么 encoding ;它所做的就是存储和管理有序的值序列。因此,sizelength函数表示它存储了多少个值。

如果您的std::wstring包含表示有效的UTF-16编码字符串的字符串,则std::wstring无关紧要。 Unicode编码只是编码代码点的方法。 UTF-16使用16位代码单元对其代码点进行编码,代码点可以包括对应于单个Unicode代码点的16位值的代理对。

但是,Unicode代码点不是该术语的某些定义的“字符”。例如,存在组合代码点,其中多个代码点被组合以形成字形。有不可见的代码点(控制代码等)。

如果您想知道std::wstring中有多少个代码点,那么您必须使用可以处理UTF-16数据的函数来遍历该字符串。如果您想知道字符串中有多少字形(逻辑字形),那么您需要使用更复杂的算法来处理它。

答案 1 :(得分:5)

要执行此操作,您必须使用Unicode数据库。您应该使用ICU(how to do it in ICU)或其他一些Unicode库。 Boost.Locale已被接受提升并将很快推出,它以一种很好的方式包含了ICU的一些功能。

然而,我怀疑你确实需要这样做。见definitions of grapheme, character, codepoint, codeunit。可能你的意思是代码点,但几乎可以肯定它不是很有用。

答案 2 :(得分:2)

根据字符串的来源,您可能没有任何控制的含义,即它是如何编码的。要将字符串转换为明确的语义,您可能必须执行以下步骤:

  1. 通过argvgetenv从环境中读取字节字符串。这是一个具有平台和区域设置相关编码的字节字符串。

  2. 通过mbstowcs()将字节字符串转换为内部固定宽度(有警告)宽字符串。 你仍然不知道结果的编码!所有你知道的是,每个宽字符都足以容纳任何“平台的字符值”,无论这意味着什么。 (在Windows中,它意味着broken)。

  3. 通过使用ICU或iconv()将WCHAR转换为UCS-4 / UTF-32,获取一系列Unicode代码点(即可以按码点操作的确定数据)。现在你知道你在做什么了!

  4. 如果您正在从具有文档编码的文件或网络中读取数据,则应将文档编码转换为UCS-4。

    获得一系列代码点后,文本处理的低级语言支持将结束。一系列代码点是您在二进制级别获得的最佳代码,用于表示文本。任何更高级别的文本操作和处理都是复杂和微妙的,并且在很大程度上取决于对“文本”的正确定义,因此最好留给专用的Unicode库(例如ICU)。在编程语言层面,“字符”是代码点,但在任何严重的应用程序中,可能不是你想要的,你想知道关于字素和规范化以及其他一百个小东西。

答案 3 :(得分:0)

你在找wcslen吗?

#include <wchar.h>
size_t wcslen(const wchar_t *s);