如何忽略字符串中的重音,以便它不会改变它的长度?

时间:2015-11-24 20:37:35

标签: c++ string string-length non-ascii-characters

我用函数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

2 个答案:

答案 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