1

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

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

但它不适用于阿拉伯字符。我还在这里看到了一个帖子:Latin1 to UTF8 conversion评论说:

latin1 不支持阿拉伯字符。您的文本如何存储为 latin1?

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

4

1 回答 1

3

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。)

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


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

不; 您可以转换它,但这绝对意味着您必须理解“拉丁语中的阿拉伯字符”到底是什么意思,因为该陈述本身并没有任何意义——它在术语上是矛盾的。

我对您的陈述进行了合理的解释,对您所获得的数据进行了有意义的解释,但我不能保证这是正确的解释。

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

于 2013-11-08T06:02:32.723 回答