阿拉伯字符编码问题:UTF-8与Windows-1256



快速背景:我继承了一个包含英语和阿拉伯语文本组合的大型sql转储文件,(我认为)它最初是使用'latin1'导出的。在导入文件之前,我将'latin1'的所有出现更改为'utf8'。阿拉伯语文本没有正确出现在phpmyadmin(我猜是正常的),但当我加载文本到一个网页与以下…

<meta http-equiv='Content-Type' content='text/html; charset=windows-1256'/> 

…一切看起来都很好,阿拉伯语文本显示得很好。


问题:我的客户非常非常非常挑剔,不想改变他的…

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>

…对应的'Windows-1256'。我不认为这将是一个问题,但是当我将字符集值更改为'UTF-8'时,所有的阿拉伯字符都显示为带问号的菱形。UTF-8不应该正确显示阿拉伯文本吗?


以下是关于我的数据库配置的一些注意事项:

  • 数据库字符集为'utf8'
  • 数据库连接排序为'utf8_general_ci'
  • 所有数据库、表和适用的字段已被整理为'utf8_general_ci'

我一直在搜索堆栈溢出和其他论坛的任何与我的问题有关的东西。我发现了类似的问题,但没有一个解决方案似乎适合我的具体情况。希望有人能帮忙!

如果文档在声明为windows-1256编码时看起来是正确的,那么它很可能是 windows-1256编码。所以它显然不是用latin1输出的——这是不可能的,因为latin1没有阿拉伯字母。

如果这只是关于一个文件,那么最简单的方法是将其从windows-1256编码转换为utf-8编码,例如使用notepad++。(打开其中的文件,通过文件格式菜单将编码更改为阿拉伯语,windows-1256。然后在文件格式菜单中选择转换为UTF-8,然后执行文件→保存。

Windows-1256和UTF-8是完全不同的编码,因此如果您将Windows-1256数据声明为UTF-8,则数据会变得混乱,反之亦然。只有ASCII字符(如英文字母)在两种编码中具有相同的表示。

如果你不给我们看你的代码,我们无法在你的代码中找到错误,所以我们如何帮助你是非常有限的。

您告诉浏览器将文档解释为UTF-8而不是Windows-1256,但是您实际上将使用的编码从Windows-1256更改为UTF-8吗?

例如,

$ cat a.pl
use strict;
use warnings;
use feature qw( say );
use charnames ':full';
my $enc = $ARGV[0] or die;
binmode STDOUT, ":encoding($enc)";
print <<"__EOI__";
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=$enc">
<title>Foo!</title>
</head>
<body dir="rtl">
N{ARABIC LETTER ALEF}N{ARABIC LETTER LAM}N{ARABIC LETTER AIN}N{ARABIC LETTER REH}N{ARABIC LETTER BEH}N{ARABIC LETTER YEH}N{ARABIC LETTER TEH MARBUTA}
</body>
</html>
__EOI__
$ perl a.pl UTF-8 > utf8.html
$ perl a.pl Windows-1256 > cp1256.html

我认为你需要从头开始。听起来你有一个Win-1256编码的数据库转储,你想从现在开始在UTF-8中使用它。这听起来也像你在使用PHP,但你的问题上有很多不相关的标签,而错过了最重要的一个,PHP。

首先,您需要将文本转储转换为UTF-8,您应该能够使用PHP完成此操作。您的转换脚本可能有两个步骤,首先读取Win-1256字节并将其解码为内部Unicode文本字符串,然后将Unicode文本字符串编码为UTF-8字节以输出到新的文本文件。

一旦你完成了,重新做数据库导入,就像你之前做的那样,但是现在你已经正确地将输入数据编码为UTF-8。

之后,它应该像读取数据库和使用正确的UTF-8编码呈现网页一样简单。

注:实际上,每次显示数据时都可以重新编码数据,但这并不能解决数据库中充满错误编码数据的问题。

为了正确显示阿拉伯字符,您需要将php文件转换为不带Bom的utf-8 这种情况发生在我身上,阿拉伯字符显示为菱形,但转换为utf-8而不带bom将解决此问题

似乎数据库被配置为UTF8,但数据本身是扩展的ascii。如果数据被转换为UTF8,它将在设置为UTF8

的内容类型中正确显示。

最新更新