无法将latin1中编码的阿拉伯字符转换为utf8

时间:2013-11-08 05:46:20

标签: mysql utf-8 character-encoding arabic latin1

我有一个带有阿拉伯字符串的MySQL表。但表格字符集为latin1。我想将其转换为utf8,以便可以正确显示表格。

我已经完成了这个:http://www.bothernomore.com/2008/12/16/character-encoding-hell/

但它对阿拉伯字符不起作用。我在这里也看到了一条帖子:Latin1 to UTF8 conversion评论说:

  

latin1不支持阿拉伯字符。你的文字怎么样?   存储为latin1?

这是否意味着我无法将其转换为任何可以显示阿拉伯字符的字符集。

1 个答案:

答案 0 :(得分:3)

Latin1(ISO 8859-1)代码集适用于西欧语言,并且没有阿拉伯字符。您需要ISO 8859-6才能获得阿拉伯字符。现在,您可以在0x85..0xFF范围内的代码点是8859-6中的有效阿拉伯字符,并在8859-1中显示为欧洲重音字符,您可以安排将8859-6值映射到UTF8。 8859-6范围的下半部分与8859-1相同;事实上,对于所有8859-x代码集都是如此,并且“half”实际上是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。)

有关8859-6的详细信息,请参阅:http://czyborra.com/charsets/iso8859.html#ISO-8859-6,有关ISO 8859-x代码集的信息,请参阅http://czyborra.com/charsets/iso8859.html。它还有指向讨论不同代码集的其他页面的链接。


  

这是否意味着我无法将其转换为任何可以显示阿拉伯字符的字符集?

没有;你可以转换它,但它肯定意味着你必须要理解你所说的“拉丁语1中的阿拉伯字符”到底是什么意思,因为这句话本身并不意味着什么 - 这在术语上是矛盾的。

我对你的陈述进行了合理的调整,对你所获得的数据进行了有意义的解释,但我无法保证这是正确的解释。

您必须知道数据是如何输入的,它应该是什么意思,并决定如何翻译它。如果您的数据是由某人使用8859-6输入的,但它存储在一个假定为8859-1的列(表,数据库)中,您可以提取值,转换为UTF8并将UTF8数据插入到期望的数据库中UTF8。 (实际上,由于8859-1将接受任意字节序列,你可以将UTF8填入8859-1列,注意每个阿拉伯字符都有两个字节。它没有意义,因为8859-1 ,但只要你不截断任何东西就会很准确。如果你截断字符串,有时候,你会在UTF8字符的中间断开,然后把数据解释为UTF8的任何东西都会对你不满意。