用于计算字符串C ++中char数的标准函数

时间:2013-10-23 16:24:25

标签: c++ string-length

是否有一个标准函数,如size()或length()来计算字符串中的字符数。以下为同一个词给出5和6:

#include <iostream>
using namespace std;
int main(){
string s="Ecole";
cout<<s.size()<<"\n";
}

#include <iostream>
using namespace std;
int main(){
string s="école";    
cout<<s.size()<<"\n";
}

谢谢。

3 个答案:

答案 0 :(得分:1)

使用:

wstring

而不是:

string

答案 1 :(得分:0)

字符串école实际上有6个字符,因为char é占用内存中的两个字节。 é的hax表示为c3 a9

ASCII字符集没有很多“特殊”字符,最奇特的可能是'(反引号)。 std :: string可以容纳大约0.025%的所有Unicode字符(通常是8位字符),因此如果要存储像école这样的字符串,请使用wstring而不是string

答案 2 :(得分:0)

简短回答:没有好的答案。文字很复杂。

首先,你需要确定你想要找到什么“长度”来确定要调用的内容。

在您的示例中,std :: string :: size()以C字符(即字节)提供长度。正如Vishnu所指出的那样,字符“é”的长度是2个字节,而不是1个字节。

另一方面,如果按照Duncan的建议切换到std :: wstring :: size(),它将开始测量UTF-16代码点的大小。在这种情况下,字符“é”是1个UTF-16代码点。

切换到wstring似乎是解决方案,但这取决于你正在做什么。例如,如果您尝试获取字符串的大小以分配缓冲区(以字节为单位),那么std :: string :: size()可能是正确的,但是std :: wstring :: size()这是错误的,因为每个UTF-16代码点需要2个字节来存储。 (从技术上讲,std :: wstring存储wchar_t字符,甚至不一定是UTF-16,并且每个代码点都需要sizeof(wchar_t)字节来存储...所以它通常不会起作用。反正。)

即使你只想要“一个人会看到的字符数”(字形数),切换到wstring也不适用于更复杂的数据。例如,“é”(字符http://www.fileformat.info/info/unicode/char/e9/index.htm'>U+00E9)是1个UTF-16代码点,但“é”也可以是表示为“e”加上组合的尖锐口音(字符http://www.fileformat.info/info/unicode/char/0301/index.htm'>U+0301)。您可能需要阅读有关Unicode规范化的信息。在某些情况下,单个“字符”需要2个UTF-16代码点,称为代理对 - 尽管很多软件都会安全地忽略这些代码。

老实说,使用Unicode你要么必须接受这样一个事实:你不会处理所有的边缘情况,或者你必须放弃一次处理一个“字符”的事情,而是做一个“字”的事情(由空格分隔的一串代码点,以使事情顺利进行。然后你会问你正在使用的图书馆 - 例如,一个绘图库 - 每个“单词”的宽度,并希望他们正确处理所有重音,组合字符,代理对等。