Подтвердить что ты не робот

Преобразование специальных характеристик, таких как ¼ и Ã, обратно к их оригинальным латинским алфавитам в С#

Мне предоставлен экспорт из базы данных MySQL, которая, похоже, несколько раз запуталась в кодировании и содержит сочетание HTML char codes, например & uuml;, и более проблемные символы, представляющие те же буквы, что и ü и Ã. Моя задача - вернуть некоторую консистенцию в файл и получить все правильные латинские символы, например. ú и ó.

Пример типа строки, с которой я имею дело, - это

Desinfektionslösungstücher für Flächen

который должен быть равен

50 Tattoo Desinfektionsl ö    sungst ü    cher f ü    r Fl ä    chen 
50 Tattoo Desinfektionsl ö sungst ü cher f ü r Fl ä chen

Есть ли способ, доступный в С#/.NET 4.5, который бы успешно перекодировал подобные ü и Ã в UTF-8?

Иначе какой подход был бы целесообразным?

Также есть символ абзаца в приведенной выше строке строки фактический символ абзаца или часть некоторой другой комбинации символов?

Я создал таблицу поиска в случае необходимости найти и заменить ниже, однако я не уверен, насколько это полно.

É -> É
“ -> "
†-> "
Ç -> Ç
à -> Ã
é, 'é
à -> ú -> ú
• -> -
Ø -> Ø
õ -> õ
í -> í
â -> â
ã -> ã
ê -> ê
á -> á
é -> é
ó -> ó
â€" -> –
ç -> ç
ª -> ª
º -> º
à  -> à
4b9b3361

Ответ 1

Ну, во-первых, поскольку данные были декодированы с использованием неправильной кодировки, вероятно, некоторые из символов невозможно восстановить. Похоже, что данные UTF-8 неправильно декодированы с использованием 8-разрядной кодировки.

Нет встроенного метода для восстановления данных, подобных этому, потому что это не то, что вы обычно делаете. Нет надежного способа декодирования данных, поскольку он уже сломан.

Что вы можете попробовать, это кодировать данные и декодировать их с неправильной кодировкой, просто наоборот:

byte[] data = Encoding.Default.GetBytes(input);
string output = Encoding.UTF8.GetString(data);

Encoding.Default использует текущую кодировку ANSI для вашей системы. Вы можете попробовать несколько разных кодировок и посмотреть, какой из них дает лучший результат.

Ответ 2

Данные только частично невосстанавливаются из-за кодирования Windows-1252, имеющего 5 неназначенных слотов. Некоторые модификации Windows-1252 заполняют их контролем но они не попадают на сообщения в Stackoverflow. Если модифицировано Windows-1252 был использован, вы можете полностью восстановить, пока вы не потеряете скрытые управляющие символы в папках с копированием.

Существует также неразрывный символ пробела, который игнорируется или превращается в пространство, обычно с помощью copypastes, но это не проблема при непосредственном использовании байтов.

Нарушение неправильной кодировки этой строки прошло:

UTF-8 -> Windows-1252 -> UTF-8 -> Windows-1252

Чтобы восстановить, вот пример:

String a = "Desinfektionslösungstücher für Flächen";
Encoding utf8 = Encoding.GetEncoding(65001);
Encoding win1252 = Encoding.GetEncoding(1252);

string result = utf8.GetString(win1252.GetBytes(utf8.GetString(win1252.GetBytes(a))));

Console.WriteLine(result);
//Desinfektionslösungstücher für Flächen

Ответ 3

Это, вероятно, строка с кодировкой окон-1252, которую вы читаете как UTF-8.

По словам Гуффа, данные были повреждены.

Давайте посмотрим на байты:
ö → C3B6 в UTF8

в windows-1252 C3 → Ã B6 → ¶

поэтому ö → ö

как насчет всех этих "ƒÂ":

ƒ → 83 Â → C2

Честность, я не знаю, почему они появляются, но вы можете попытаться стереть их и сделать некоторые преобразования, о которых говорил Гуффа. Удачи.

Ответ 5

Я уже беспокоился об этой проблеме char. Решение:

My. (cs) html файл был UTF-8; Я преобразовал в UTF-8Y (UTF-8 с спецификацией).