Существует путаница между символом Unicode и его представлением utf-8. NO-BREAK SPACE - это действительно символ Юникода U + 00A0, а его представление utf-8 - "\xc2\xa0"
И Â
- это ПИСЬМО ЛАТИНСКОГО КАПИТАЛА С CIRCUMFLEX, или символ Юникода U + 00C2, и его представление в Юникоде "\xc3\x82"
.
Это означает, что ваша начальная строка не содержит пробела. Если ваш набор символов редактора - Latin1 или windows cp1252, он будет содержать повторения «\ xc2 \ x20» (т. Е. Латинские символы «В» и пробел), а если это utf8, он будет содержать повторы «\ xc3 \ x82 \ x20». "(т. е. utf8 в коде 'и'). Затем, когда вы ищете вхождение «\ u00A0», вы фактически ищете вхождения «\ xc2 \ xa0», которого нет в исходной строке. Ошибка сегментации вызвана тем, что pos
является std::string::npos
: str.find(unicode, pos)
вызывает неопределенное поведение.
Что делать: выбери свою сторону. Поскольку вы используете узкие строки, вы должны решить, какую кодировку вы используете. Если вы используете utf8 (распространенный в мире Linux), то символ NO-BREAK SPACE представляет собой строку длиной 2 символа: { 0xc2, 0xa0 }
. И эта строка:
string unicode = "\u00A0";
точно такой же, как этот:
string unicode = "\xc2\xa0";
и прежде всего контролируйте, что у вас есть действующий пункт перед его использованием:
...
size_t pos = str.find(unicode);
if (pos == string::npos) return;
...