我用函数length()
确定C ++中某些字符串的长度,但注意到一些奇怪的事情:比如我在main
函数中定义
string str;
str = "canción";
然后,当我按str
计算str.length()
的长度时,我得到输出8
。如果我定义str = "cancion"
并再次计算str
的长度,则输出为7
。换句话说,字母'o'上的重音正在改变字符串的实际长度。其他口音也会发生同样的事情。例如,如果str = "für"
它会告诉我它的长度是4
而不是3
。
我想知道在确定字符串的长度时如何忽略这些重音字符;但是,我不想忽略像'
这样的孤立字符。例如,如果str = livin'
,则str
的长度必须为6
。
答案 0 :(得分:3)
这是一个很难的主题。您的字符串可能是UTF-8编码的,并且str.length()
对字节进行计数。 ASCII字符可以用1个字节编码,但是代码大于127的字符可以用1个字节以上编码。
计算unicode代码点数可能无法为您提供所需的答案。取而代之的是,您需要考虑代码点的宽度,以处理分离的重音符号和具有两倍宽度的代码点(也许还有其他情况)。因此,如果不使用库,很难正确地做到这一点。
您可能想签出ICU。
如果案例有约束,并且您不想为此使用库,则可能要签出UTF-8 encoding(这并不困难),并创建一个简单的UTF-8代码点计数器(一种简单的算法可能是计算(b&0xc0)!=0x80
的字节数。)
答案 1 :(得分:0)
听起来像UTF-8编码。由于带有重音的字符不能存储在单个字节中,因此它们以2个字节存储。见https://en.wikipedia.org/wiki/UTF-8