在C ++中删除零宽度字符?

时间:2018-12-06 04:06:14

标签: c++ ofstream removing-whitespace zero-width-space

我正在使用C ++文件,但是遇到了一个有趣的问题。 我正在将字符串输出到文本文件中(使用ofstream),并且有以下几行。

void InstructionWriter::outputLabel(string s){
string sLabel;
sLabel = s;
sLabel.erase(remove(sLabel.begin(), sLabel.end(), ' '),sLabel.end());

sLabel = "(" + function + "$" + sLabel + ")\n" ;
outputFile << sLabel;
}

问题出在txt文件输出期间。

当我转到运行outputLabel的文本文件时,突出显示该行将计算+1个字符。 +1是“看不见的”。突出显示该行不会选择它。解决此问题的唯一方法是从右侧开始删除。按下')'后,我会注意到我再次按下了Delete键,但是光标没有移动,似乎没有任何内容被删除。

我认为它正在潜入零宽度字符,但是我不知道如何从字符串中删除它,有人对要查找的函数有任何想法吗?

@ smac89

terminate called after throwing an instance of 'std::length_error'
  what():  basic_string::_M_replace
0

这是终端在运行您提到的命令后向我扔的东西。

2 个答案:

答案 0 :(得分:0)

请尝试执行以下操作,而不要使用sLabel.erase(remove(sLabel.begin(), sLabel.end(), ' '),sLabel.end());

std::string from = " ", to = "";
size_t start_pos = 0;
while ((start_pos = sLabel.find(from, start_pos)) != std::string::npos) {
  sLabel.replace(start_pos, from.length(), to);
  start_pos += to.length();
}

因为该字符串是UTF-8编码的;并且您不能依赖单个字节。仅操作子字符串。

答案 1 :(得分:0)

每个人,我都能弄清楚。

根据Smacs的评论,我将输出文本文件上传到二进制编辑器。奇怪的是,我在手动输入的换行符之前找到了一个0D。

我在字符串上使用了正则表达式替换,现在它没有在字符串中添加该0D字符。

感谢所有提示。