c++字符串擦除不适用于UTF8字符串,我可以使用什么库
c++ string erase does not work for UTF8 string, what library can I use?
程序:
void foo() {
string sourceStr = "Tag:贾鑫@VoltDB";
string insertStr = "XinJia";
int start = 4;
int length = 2;
sourceStr.erase(start, length);
sourceStr.insert(start, insertStr);
cout << sourceStr << endl;
}
对于这个程序,我希望输出为"标记:XinJia@VoltDB",但std字符串擦除和插入似乎不适用于UTF-8字符串。
有没有我可以使用的提升库?我应该如何解决这个问题?
在与其他人交谈后,我意识到没有标准的库可以解决这个问题。因此,我编写了一个函数来完成我的工作,并希望与其他有类似问题的人分享:
std::string overlay_function(const char* sourceStr, size_t sourceLength,
std::string insertStr, size_t startPos, size_t length) {
int32_t i = 0, j = 0;
while (i < sourceLength) {
if ((sourceStr[i] & 0xc0) != 0x80) {
if (++j == startPos) break;
}
i++;
}
std::string result = std::string(sourceStr, i);
result.append(insertStr);
bool reached = false;
j = 0;
while (i < sourceLength) {
if ((sourceStr[i] & 0xc0) != 0x80) {
if (reached) break;
if (++j == length) reached = true;
}
i++;
}
result.append(std::string(&sourceStr[i], sourceLength - i));
return result;
}
有了这个功能,我的程序可以是:
cout << overlay_function(sourceStr, sourceStr.length(), 4+1, 2) << endl;
希望能有所帮助。
索引是编码值索引,而不是字符(或者在您的情况下是表意字符)索引。使用UTF-8,每个字符可以由多个编码单元组成,在您的情况下也是如此。请查找正确的编码单元索引。
提示1:我将使用.substr
和+
字符串串联。
提示2:您似乎可以搜索字符:
和@
。请注意,这些编码单元不能出现在多单元UTF-8字符中。查看string
的方法。
相关文章:
- 将字符串(可以是十进制字符串或十六进制字符串)转换为整数C++
- 查找字符串可以减少到 0 的步骤数
- 是否可以使C++类成为Objc类的委托
- 是否可以使一个类成为两个不同层次结构的子类?
- Cout 一个字符串可以打印任何内容到屏幕上
- 是否有编译器标志可以使较新的 gcc 版本像旧版本一样构建
- C 可以使destuructor不称为班级成员和基类攻击方的灾难
- 可以使未命名的结构静态
- 是否可以使整数仅收到一个单个数字而不是两个接收输入
- 输入到字符串流并在单个语句中转换为字符串.可以没有帮助程序类
- C++:有哪些常规方法可以使代码更有效地用于大数字
- 正则表达式:从模式字符串 1.string2'string3 中提取字符串,其中字符串 1 可以包含 '." 字符
- 是否可以使 std 容器使用默认运算符为新?
- LD_BIND_NOW可以使可执行文件运行得更慢?
- 是否可以使头文件使文本居中?- 在控制台中
- 有什么方法可以使核心忙碌等待
- 有没有一种技术可以使虚函数在所有派生类中强制重写?
- 有没有一种方法可以使全局函数/静态成员函数一次可呼出
- 是否有一种方法可以使此C 14递归模板在C 17中短
- 是否可以使std::string始终包含一个小写字符串