удаление символа нулевой ширины в C ++? - PullRequest
0 голосов
/ 06 декабря 2018

Я работаю над файлом 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;
}

Проблема в том, что он выводит текстовый файл.

Когда я направляюсь к текстовому файлу, в котором был запущен outputLabel, выделение строки подсчитывает символы +1 символа.что +1 "невидим".Выделение строки не выберет ее.Единственный способ исправить это - начать удаление справа.После того, как вы нажмете «)», я замечу, что снова нажал «Удалить», но курсор не двигался, и кажется, что ничего не было удалено.

Я думаю, что это скрытый символ нулевой ширины, но я не знаю, как вычеркнуть это из строки, у кого-нибудь есть какие-нибудь идеи о том, на какие функции смотреть?

@ smac89

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

Это то, что терминал бросил в меня после выполнения упомянутой вами команды.

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Каждый, я смог понять это.

за комментарий Smacs, я загрузил выходной текстовый файл в двоичный редактор.как ни странно, я нашел 0D перед символом новой строки, который я вставил вручную.

Я использовал замену регулярного выражения в строке, и теперь он не добавляет этот 0D символ в строку.

Спасибо за все советы.

0 голосов
/ 06 декабря 2018

Вместо 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;и вы не можете полагаться на отдельные байты.Манипулировать только подстрока.

...