2016-12-01 2 views
1

Объяснение:Как удалить недопустимые символы из кодированного файла UTF-8?

Я пришел по ребру случае при написании моего веб-приложения. Я принимаю файлы UTF-8, которые нужно загрузить, и у меня есть чек, чтобы подтвердить, что кодировка UTF-8 (или, по крайней мере, самая лучшая проверка, возможно, нет серебряной пули, я знаю, что есть много другие вопросы о переполнении стека для этой конкретной проблемы).

В качестве теста я взял ANSI-кодированный файл и преобразовал его в UTF-8 обоими (в отдельных тестах), преобразуя его в UTF-8 в Notepad ++, а также просто расшифровывая как UTF-8 (хотя это ANSI) на лету в C#, используя Encoding.UTF.GetBytes(inputStream).

Где Проблема Напрашивается:

Позже, я помещаю исходные данные файла в качестве одного из элементов в файле XML. Здесь возникает проблема. Похоже, что символ сохраняется из файла ANSI, который (я полагаю) недействителен в UTF-8. Когда я пытаюсь загрузить XML с помощью следующей команды ...

XDocument xmlSample = XDocument.Load(outputPath);

Я получаю это исключение ...

{"Invalid character in the given encoding. Line 10, position 14."}

Что выглядит в Visual Studio ...

VSImg

И вот это в Блокноте ++ ...

NPPImg

Ниже копия характер и вставили.

От АЭС: ¡ Из Visual Studio Струнный просмотра:

Вопрос:

Как удалить недопустимые символы из UTF-8 кодировке, или, по крайней мере, обнаружить их в здравом образом так Я могу отклонить файл?

+1

Скопируйте и вставьте персонажа в вопрос, он может дать некоторые подсказки. – Quantic

+0

XmlReader.Create (строка, настройки) вы можете добавить параметр параметров, чтобы игнорировать проверку символов. Это не всегда работает, но может быть в вашем случае. Символ температуры не является незаконным в xml, просто для реализации Microsoft требуется специальная обработка этих символов. – jdweng

+0

Я копирую и вставляю персонажа. –

ответ

0

Во-первых, что касается вашего примера, слово «температура» предполагает, что оскорбительный символ на самом деле является знаком «градус» (°, Юникод 176), так что в полном тексте читается «Температура (° C)». В этом случае символ будет кодироваться как байты \260 в ANSI и как два байта \302\260 в UTF-8. \260 (в этом случае предшествует левая скобка) недопустимо UTF-8.

Во-вторых - если вы все еще заинтересованы после того, как более года - не могли бы вы уточнить, как вы используете Encoding.UTF.GetBytes() в GetBytes() читает символы, а не байты, а символы в C# не имеют «декодировать файл в кодировке UTF-8?» кодирование; кодировка была применена при чтении файла и преобразовании его в символы. Что UTF.GetBytes() делает это кодирует (не декодирует) символы в последовательность байтов UTF-8.

Чтобы проверить последовательность входящих байтов, вы можете использовать Encoding.UTF.GetChars(), чтобы декодировать последовательность байтов в символы.В зависимости от используемого конструктора вы можете получить строку «очищенного» символа (с потерей данных при возникновении проблем) или получить DecoderFallbackException в случае нарушения последовательности байтов, чтобы вы могли отклонить ввод.

Смежные вопросы