程序:
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;
}
对于这个程序,我希望输出为“Tag:XinJia @ VoltDB”,但似乎std字符串erase和insert对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;
希望它有所帮助。
答案 0 :(得分:0)
C ++字符串中的索引是编码值索引,而不是字符(或在您的案例表意文字中)索引。使用UTF-8,每个字符可以由多个编码单元组成,在您的情况下也是如此。找到正确的编码单位索引。
提示1:我为此使用.substr
和+
字符串连接。
提示2:您似乎可以搜索字符:
和@
。请注意,这些编码单元不能出现在多单元UTF-8字符中。查看string
。