【发布时间】:2018-12-13 23:37:05
【问题描述】:
我正在尝试将 Unicode Character 'NO-BREAK SPACE' (U+00C2) 即 Â 替换为字符串 str 中的空格“”,而在某些情况下运行它给了我分段错误。谁能建议我这是无效的内存访问。
我做得对吗?
还有其他方法吗?
string str = "transaction applies: Â Â Â Â Â Â Â Â Â {79}";
void cleanup(string& str)
{
string unicode = "\u00C2";
size_t pos = str.find(unicode);
while(str.find(unicode, pos)!=string::npos && pos != str.length())
{
pos = str.find(unicode, pos);
str.replace(pos, unicode.length(), " " ); //unicode replace by a space
// this above line is giving segmentation fault
pos = pos + unicode.length();
}
return;
}
输出:
【问题讨论】:
-
你想多了。
for (char &c:str) {if (c == (char)0xA0) c=' ';} -
将 NBSP 等同于 Â 令人困惑。我建议您更准确地了解您的字符串实际上是什么。这两者可能在不同的编码中具有相同的字节序列,但它们是非常不同的东西。这有点像取一个整数,将位重新解释为双精度值,然后将得到的双精度值与整数值相等。
-
@SamVarshavchik 感谢您的输入,但它不会更改字符串 str,即不会将 Â 替换为 ' '(空格)。
-
 是 U+00C2 而 nbsp 是 U+00A0。这是两个不同的代码点。
-
@SamVarshavchik Unicode 代码点
A0在 UTF-8 中编码为C2 A0。仅仅替换A0字节是不够的。这里的问题可以通过一个调试器或者一堆printfs来追踪来解决。
标签: c++ string unicode replace