如何忽略字符串中的重音符号,使其不改变长度

How to ignore accents in a string so it does not alter its length?

本文关键字:改变 符号 字符串 何忽略 音符      更新时间:2023-10-16

我正在用函数length()确定C++中某些字符串的长度,但注意到了一些奇怪的事情:比如说我在main函数中定义

string str;
str = "canción";

然后,当我用str.length()计算str的长度时,我得到作为输出的8。如果我定义str = "cancion"并再次计算str的长度,则输出为7。换句话说,字母"o"上的重音正在改变字符串的实际长度。其他口音也是如此。例如,如果str = "für",它会告诉我它的长度是4,而不是3

我想知道在确定字符串长度时如何忽略这些重音字符;但是,我不想忽略像'这样的孤立字符。例如,如果是str = livin',则str的长度必须是6

这是一门很难的科目。您的字符串可能是UTF-8编码的,str.length()计算字节数。ASCII字符可以用1个字节编码,但代码大于127的字符则用1个以上的字节编码。

计算unicode代码点可能无法得到所需的答案。相反,您需要考虑代码点的宽度来处理分隔重音和具有双倍宽度的代码点(可能还有其他情况)。因此,如果不使用库,很难正确地执行此操作。

你可能想去重症监护室看看。

如果您有一个受约束的情况,并且不想为此使用库,您可能需要检查UTF-8编码(这并不困难),并创建一个简单的UTF-8代码点计数器(一个简单算法可以是在(b&0xc0)!=0x80中计算字节)。

听起来像UTF-8编码。由于带有重音符号的字符不能存储在一个字节中,所以它们存储在2个字节中。看见https://en.wikipedia.org/wiki/UTF-8