Как этот сайт исправляет кодировку? - PullRequest
1 голос
/ 15 мая 2010

Я пытаюсь перевернуть этот текст:

×וויר. העתיד של רשתות חברתיות והתקשורת ×©×œ× ×•

В этот текст:

אוויר. העתיד של רשתות חברתיות והתקשורת שלנו

Почему-то этот сайт:

http://www.pixiesoft.com/flip/

Может это сделать, и я хотел бы знать, как я мог бы сделать это сам (с любым языком программирования или программным обеспечением)

Простое сохранение файла как UTF8 не сделает этого.

Моя мотивация для этого вопроса заключается в том, что у меня есть экспортированный XML-файл друга с искаженным текстом, который я хочу превратить в исправленный текстовый файл на иврите.

Экспорт XML изначально был искажен при импорте и экспорте MySQL, но у меня нет информации, необходимой для его исправления или отслеживания проблемы.

Спасибо.

Ответы [ 6 ]

4 голосов
/ 16 мая 2010

Поскольку проблема заключалась в ошибке MySQL с двойным кодированием строк UTF8, MySQL - верный способ ее решения.

Выполнение следующих команд решит эту проблему -

  • mysqldump $DB_NAME -u $DB_USER -p -h $DB_HOST.EXAMPLE.NET --add-drop-table --default-character-set=latin1 > export.sql - здесь используется latin1, чтобы заставить MySQL не разделять символы, и не должен использоваться иначе.
  • cp export{,.utf8}.sql - создание резервной копии.
  • sed -i -e 's/latin1/utf8/g' export.utf8.sql - замена латиницы 1 на utf8 в файле, чтобы импортировать его как UTF-8 вместо 8859-1.
  • mysql $DB_NAME -u $DB_USER -p -h $DB_HOST.EXAMPLE.NET < export.utf8.sql - импортировать все обратно в базу данных.

Это решит проблему примерно за десять минут.

2 голосов
/ 15 мая 2010

Возможно, вы захотите посмотреть здесь - принятый ответ на этот вопрос показывает, как угадать кодировку byte[]. Все, что вы должны гарантировать, это получить правильные байты из тарабарщины. Конечно, догадки всегда могут быть неудачными ...

2 голосов
/ 15 мая 2010

Если вы внимательно посмотрите на тарабарщину, вы можете сказать, что каждый еврейский символ закодирован как 2 символа - кажется, что של закодирован как של.

Это говорит о том, что вы смотрите на UTF8 или UTF16 как ASCII. Преобразование в UTF8 не поможет, потому что это уже ASCII и сохранит эту кодировку.

Вы можете прочитать каждую пару байтов и восстановить исходный UTF8 из них.

Вот немного C #, которое я придумал - это очень упрощенно (не полностью работает - слишком много предположений), но я мог видеть, что некоторые символы преобразованы правильно:

private string ToProperHebrew(string gibberish)
{
   byte[] orig = Encoding.Unicode.GetBytes(gibberish);
   byte[] heb = new byte[orig.Length / 2];

   for (int i = 0; i < orig.Length / 2; i++)
   {
     heb[i] = orig[i * 2];
   }

   return Encoding.UTF8.GetString(heb);
}

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

1 голос
/ 16 декабря 2011

Основываясь на ответах Одеда и Тедди, я придумал этот метод, который работал для меня:

public String getProperHebrew(String gibberish){
    byte[] orig = gibberish.getBytes(Charset.forName("windows-1252"));

    try {
        return new String(orig, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
        return "";
    }
}
1 голос
/ 15 мая 2010

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

Полагаю, эта кодировка сработает.

0 голосов
/ 26 мая 2010

gibberish.encode('windows-1252').decode('utf-8', 'replace')

...