查找 std::wstring 的长度

3

我如何确定一个 std::wstring 字符串的长度(字符数)?

myStr.length() 返回字节大小(我觉得),而不是字符数。我需要创建自己的函数来找到字符数,还是有本地的 C++ 方法或本地的 WinAPI 方法可以使用?


3
返回字符串中字符的个数。 - billz
2
使用 myStr.length() 可以得到字节数(我认为),但这并不是字符数。你为什么这样认为? - ildjarn
2
@所有人 `std::wstring::size()返回字符串中宽字符元素的数量。这与字符数不同(正如您正确地注意到的那样)。不幸的是,std::basic_string模板(以及其实例化,例如std::string和std::wstring)是编码无关的。在这个意义上,它实际上只是一个字节字符串的模板,而不是字符字符串。 因此,.size()`不会给我字符数。 - sazr
@NicolBolas 我会小心谨慎地对待这个声明... Unicode标准在很多地方都使用了“字符”这个词(例如表2-1:“Unicode标准编码的是字符,而不是字形”)。 - jogojapan
1
@JakeM 可以使用 tolower() 函数来实现。请参考 cppreference 上给出的示例:http://en.cppreference.com/w/cpp/locale/ctype/tolower。 - jogojapan
显示剩余9条评论
2个回答

5
std::wstring::length()将为您提供字符数,其中character被定义为wstring对象的原子单位,即wchar。当标准引用characters时,这就是其含义(有关在标准中使用该词的更多详细信息,请参见此帖子)。
然而,对于Unicode字符,一个wchar是否对应于一个Unicode字符取决于wstring内部使用的编码方式。如果使用UTF-16,这通常(但不一定)是情况,那么对于基本多语言平面(即所有从ISO-8859派生的字符集以及大多数常用的CJK字符,但不包括某些更奇特的(例如古典汉字)字符),一个wchar只会对应一个Unicode字符(*)。如果您想在这种情况下正确计算所有 Unicode 字符的数量,则需要使用支持Unicode的库(例如ICU)或自己编写代码。

(*)如果使用了组合字符,则会出现其他问题,正如@一二三正确指出的那样。最好使用适当的库来正确计算它们。


8
如果使用的是UTF-16编码,通常指的是在Windows操作系统上使用。 - Nicol Bolas
@NicolBolas 我会把它改成“经常” :) - jogojapan
1
即使在UTF-16的BMP中,组合形式和表示形式可能会使一个“字符”看起来像两个wchar(反之亦然)。 - 一二三
@一二三 非常正确!我已经为此添加了一个脚注。 - jogojapan

4
如果你想知道以为单位的长度,请使用。如果你想知道以Unicode代码点为单位的大小,你需要找到一个能够计算它们的库。你也可以编写一个自己的库——确定UTF-16编码的代码点是否使用一个或两个实体的规则并不太难,参见http://en.wikipedia.org/wiki/Utf-16。要知道你的是16位(还是32位),请使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接