2013-11-08 4 views
1

У меня есть таблица MySQL с арабскими строками. Но набор символов таблицы - latin1. Я хочу преобразовать его в utf8, чтобы таблица могла отображаться правильно.Не удалось преобразовать арабские символы, закодированные в latin1 в utf8

Я прошел через это: http://www.bothernomore.com/2008/12/16/character-encoding-hell/

Но это не сработало для арабских символов. Я также вижу сообщение здесь: Latin1 to UTF8 conversion Комментарий говорит:

latin1 не поддерживает арабские символы. Как можно сохранить ваш текст как latin1?

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

+0

См. http://stackoverflow.com/a/17756257/802117 – Ansari

+0

@Ansari Я знаю эту работу, но проблема в том, что я не могу редактировать файл дампа, так как он слишком велик для открытия в любом тексте редактор – sam

+0

использует утилиту вроде sed или что-то делать это программно. – Ansari

ответ

2

Набор символов Latin1 (ISO 8859-1) предназначен для западноевропейских языков и просто не имеет арабских символов. Для получения арабских символов вам потребуется ISO 8859-6. Теперь у вас могут быть кодовые точки в диапазоне 0x00..0xFF, которые являются действительными арабскими символами в 8859-6 и отображаться в качестве европейских акцентированных символов в 8859-1, и вы можете организовать сопоставление значений 8859-6 с UTF8. Нижняя половина диапазона 8859-6 такая же, как 8859-1; это верно для всех наборов кодов 8859-x, и «половина» действительно составляет 5/8, так как кодовые точки 0x80..0x9F являются управляющими кодами.

Символы, определенные в 8859-6, которые не совпадают с 8859-1, начинаются с 0xA0. В наборе 8859-6 имеется множество пробелов.

A0 U+00A0 NO-BREAK SPACE 
A4 U+00A4 CURRENCY SIGN 
AC U+060C ARABIC COMMA 
AD U+00AD SOFT HYPHEN 

BB U+061B ARABIC SEMICOLON 
BF U+061F ARABIC QUESTION MARK 

C1 U+0621 ARABIC LETTER HAMZA 
C2 U+0622 ARABIC LETTER ALEF WITH MADDA ABOVE 
C3 U+0623 ARABIC LETTER ALEF WITH HAMZA ABOVE 
C4 U+0624 ARABIC LETTER WAW WITH HAMZA ABOVE 
C5 U+0625 ARABIC LETTER ALEF WITH HAMZA BELOW 
C6 U+0626 ARABIC LETTER YEH WITH HAMZA ABOVE 
C7 U+0627 ARABIC LETTER ALEF 
C8 U+0628 ARABIC LETTER BEH 
C9 U+0629 ARABIC LETTER TEH MARBUTA 
CA U+062A ARABIC LETTER TEH 
CB U+062B ARABIC LETTER THEH 
CC U+062C ARABIC LETTER JEEM 
CD U+062D ARABIC LETTER HAH 
CE U+062E ARABIC LETTER KHAH 
CF U+062F ARABIC LETTER DAL 

D0 U+0630 ARABIC LETTER THAL 
D1 U+0631 ARABIC LETTER REH 
D2 U+0632 ARABIC LETTER ZAIN 
D3 U+0633 ARABIC LETTER SEEN 
D4 U+0634 ARABIC LETTER SHEEN 
D5 U+0635 ARABIC LETTER SAD 
D6 U+0636 ARABIC LETTER DAD 
D7 U+0637 ARABIC LETTER TAH 
D8 U+0638 ARABIC LETTER ZAH 
D9 U+0639 ARABIC LETTER AIN 
DA U+063A ARABIC LETTER GHAIN 

E0 U+0640 ARABIC TATWEEL 
E1 U+0641 ARABIC LETTER FEH 
E2 U+0642 ARABIC LETTER QAF 
E3 U+0643 ARABIC LETTER KAF 
E4 U+0644 ARABIC LETTER LAM 
E5 U+0645 ARABIC LETTER MEEM 
E6 U+0646 ARABIC LETTER NOON 
E7 U+0647 ARABIC LETTER HEH 
E8 U+0648 ARABIC LETTER WAW 
E9 U+0649 ARABIC LETTER ALEF MAKSURA 
EA U+064A ARABIC LETTER YEH 
EB U+064B ARABIC FATHATAN 
EC U+064C ARABIC DAMMATAN 
ED U+064D ARABIC KASRATAN 
EE U+064E ARABIC FATHA 
EF U+064F ARABIC DAMMA 

F0 U+0650 ARABIC KASRA 
F1 U+0651 ARABIC SHADDA 
F2 U+0652 ARABIC SUKUN 

Любой символ в диапазоне 0xA0..0xFF не перечисленных выше не является допустимым арабский символ в 8859-6.

Программа iconv может, вероятно, обрабатывать преобразование 8859-6 в UTF-8; У меня есть программа, которая тоже может это сделать, и это один файл данных для этой программы. (Он преобразует любой одиночные байты кодового набор, SBCS, к UTF8, при соответствующей таблице.)

См: http://czyborra.com/charsets/iso8859.html#ISO-8859-6 для 8859-6 специфический и http://czyborra.com/charsets/iso8859.html как правило, для получения информации о ISO 8859-х кодовых наборах. Он также имеет ссылки на другие страницы, посвященные различным наборам кода.


Означает ли это, я не могу преобразовать его в любой набор символов, которые могут отображать арабские символы?

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

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

Вам нужно знать, как были введены данные, что это означает, и решить, как их перевести. Если ваши данные были введены кем-то с использованием 8859-6, но он был сохранен в столбец (таблица, база данных), который предположил, что он равен 8859-1, вы можете извлечь значения, перевести на UTF8 и вставить данные UTF8 в базу данных, которая ожидает UTF8.(На самом деле, поскольку 8859-1 принимает любую произвольную последовательность байтов, вы можете набить UTF8 на столбец 8859-1, отметив, что для каждого арабского символа будет два байта. Это не имеет смысла, поскольку 8859-1 , но он будет точным до тех пор, пока вы ничего не усекаете. Если вы усекаете строку, некоторое время вы разрываете середину символа UTF8, а затем все, что интерпретирует данные как UTF8, будет быть недовольны вами.

+0

Означает ли это, что я не могу преобразовать ее в любой набор символов, который может отображать арабские символы. – sam

+0

Позвольте мне объяснить вам то, что я сделал: создал таблицу: CREATE TABLE 'Ā' ( ' a' VARCHAR (255) DEFAULT NULL ) ENGINE = InnoDB DEFAULT CHARSET = latin1 и вставляли эту строку "كيف حالك" Но делать выбор *из; не отображает данные должным образом. Отображается как "?????" – sam