如何忽略字符串中的重音符号,使其不改变长度
How to ignore accents in a string so it does not alter its length?
我正在用函数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
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 变量没有改变?通过向量的函数调用
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- vscode g++链路故障:体系结构x86_64的未定义符号
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 使用gcc从静态链接的文件中查找可选符号
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- VC++本机单元测试,找不到调试符号
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- 如何在不改变顺序的情况下将int64值移位到无符号int64空间
- 如何忽略字符串中的重音符号,使其不改变长度
- 如果我声明有符号的字符,ASCII值会改变吗
- 为什么按位否定运算符"~"转换为 int?(从"int"转换为"无符号字符"可能会改变其值)
- flto改变符号可见性