Как исправить кодировку UTF для пробелов?

В моем коде С# я извлекаю текст из документа PDF. Когда я это делаю, я получаю строку в кодировке UTF-8 или Unicode (я не уверен, какой). Когда я использую Encoding.UTF8.GetBytes(src);, чтобы преобразовать его в массив байтов, я заметил, что пробелы на самом деле являются двумя символами с байтовыми значениями 194 и 160.

Например, строка "CLE action" выглядит как

[67, 76, 69, 194 ,160, 65 ,99, 116, 105, 111, 110]

в массиве байтов, где пробелы равны 194 и 160... И из-за этого src.IndexOf("CLE action"); возвращает -1, когда мне нужно, чтобы он возвращал 1.

Как я могу исправить кодировку строки?

Ответ 1

194 160 - это кодировка UTF-8 кодового пункта NO-BREAK SPACE (тот же код, который HTML вызывает  ).

Так что это действительно не пространство, хотя оно похоже на одно. (Например, вы увидите, что это не будет переносом слов). Соответствие регулярного выражения для \s будет соответствовать ему, но простого сравнения с пробелом не будет.

Чтобы просто заменить пространства NO-BREAK, вы можете сделать следующее:

src = src.Replace('\u00A0', ' ');

Ответ 2

Интерпретация \xC2\xA0 (= 194, 160), поскольку UTF8 фактически дает \xA0, который является unicode неразрывным пространством. Это отличается от обычного пространства, и, таким образом, не соответствует обычным пространствам. Вы должны соответствовать нераспадающемуся пространству или использовать нечеткое сопоставление с любым пробелом.

Ответ 3

В символе UTF8 значение c2 a0 (194 160) определяется как NO-BREAK SPACE. Согласно ISO/IEC 8859 это пространство, которое не допускает вставки строки. Обычно программное обеспечение для обработки текстов предполагает, что разрыв строки может быть вставлен любым символом пробела (так обычно выполняется перенос слов). Вы должны иметь возможность просто заменить замену в своей строке символов нормальным пространством, чтобы устранить проблему.