2010-05-15 2 views
1

Я пытаюсь превратить этот текст:Как этот сайт исправляет кодировку?

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

В этом тексте:

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

Каким-то образом, этот сайт:

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

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

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

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

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

Спасибо.

ответ

4

Поскольку проблема была ошибкой 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 - Замена latin1 на utf8 в файле, чтобы импортировать его как UTF-8 вместо 8859-1.
  • mysql $DB_NAME -u $DB_USER -p -h $DB_HOST.EXAMPLE.NET < export.utf8.sql - импортировать все обратно в базу данных.

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

+0

Среди нас есть гиганты, роуминг на виду. Удивительная работа Томар !!! –

+0

Кстати, это была вся разница в команде sed - diff export. * 10c10 /*! 40101 SET NAMES utf8 * /; –

1

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

< META HTTP-эквив = "Content-Type" содержание = "текст/html; Charset = Windows, 1255" />

Я полагаю, что эта кодировка будет выполнять работу.

+2

не HTML тег, но HTTP заголовка –

+0

Благодаря Тедди. Я попытался изменить файл на windows 1255 с помощью блокнота ++, и это не помогло. –

+0

@Col благодарит за исправление. – Thea

2

Если вы внимательно посмотрите на тарабарщину, вы можете сказать, что каждый символ на иврите закодирован как 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); 
} 

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

+0

Спасибо Одед! Как вы предлагаете мне это сделать? (есть ли конвертер, который может сделать это для файла?) –

+0

@Tal: Разверните его образец кода и напишите небольшую утилиту. Не сложно. –

+0

Технически это не решит проблему, поскольку она просто ломает больше кодировки. Я думал об использовании sed для массового поиска и замены, но это не требуется, поскольку мы можем заставить mysql правильно экспортировать данные. –

2

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

0

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

+0

На каком языке это? :) –

1

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

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 ""; 
    } 
} 
Смежные вопросы