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

标签 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 doesn't have support for Arabic characters. How can your text be stored as latin1?

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

最佳答案

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-x 代码集的信息。它还包含指向讨论不同代码集的其他页面的链接。


Does it mean I cannot convert it to any character set which could display the Arabic characters?

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

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

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

关于mysql - 无法将以 latin1 编码的阿拉伯字符转换为 utf8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19852429/

相关文章:

c# - 将 byte[] 转换为 char[]

Java - 日语文件名乱码

mysql - MySql中如何在不分组的情况下获取字段的最大值

mysql - 如何从另一台计算机连接Mysql服务器?

java - Python 编码的 utf-8 string\xc4\x91 在 Java 中

php - utf8_general_ci 转换

mysql - 在 mysql 中使用 GROUP BY 给出语法错误

javascript - 未定义的字段正在插入数据库

perl - 如何从 Perl 将文件另存为 UTF-8?

javascript - 如何将大型 UTF-8 字符串转换为 ASCII?