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