快速背景:我继承了一个包含英文和阿拉伯文字组合的大型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不应该正确显示阿拉伯语文本吗?
以下是关于我的数据库配置的一些注意事项:
我一直在搜索堆栈溢出和其他论坛,以解决与我的问题有关的任何问题。我发现了类似的问题,但解决方案似乎并不适合我的具体情况。希望有人可以帮忙!
答案 0 :(得分:3)
如果文档在声明为windows-1256编码时看起来正确,则很可能是 windows-1256编码。所以它显然没有使用latin1导出 - 这本来是不可能的,因为latin1没有阿拉伯字母。
如果这只是一个文件,那么最简单的方法是将它从windows-1256编码转换为utf-8编码,使用例如Notepad++。 (打开文件,通过文件格式菜单将编码更改为阿拉伯语,windows-1256。然后在文件格式菜单中选择转换为UTF-8并执行文件→保存。)
Windows-1256和UTF-8是完全不同的编码,因此如果您将Windows-1256数据声明为UTF-8,则数据会全部搞乱,反之亦然。只有ASCII字符(例如英文字母)在两种编码中具有相同的表示。
答案 1 :(得分:2)
如果您没有向我们展示您的代码,我们就无法在您的代码中找到错误,因此我们对您的帮助非常有限。
您告诉浏览器将该文档解释为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
答案 2 :(得分:2)
我认为你需要回到原点。听起来你有一个Win-1256编码的数据库转储,你想从现在开始使用UTF-8。这听起来好像你正在使用PHP,但你的问题上有很多不相关的标签,并且缺少最重要的标签,PHP。
首先,您需要将文本转储转换为UTF-8,并且您应该能够使用PHP执行此操作。您的转换脚本可能有两个步骤,首先读取Win-1256字节并将它们解码为内部Unicode文本字符串,然后将Unicode文本字符串编码为UTF-8字节,以便输出到新的文本文件。
完成后,像以前一样重做数据库导入,但现在您已将输入数据正确编码为UTF-8。
之后,它应该像读取数据库和使用正确的UTF-8编码呈现网页一样简单。
P.S。实际上,每次显示数据时都可以对数据进行重新编码,但这并不能解决数据库中数据编码错误的问题。
答案 3 :(得分:0)
为了正确显示阿拉伯字符,您需要将您的php文件转换为utf-8 而不是Bom 这件事发生在我身上,阿拉伯文字符显示钻石,但转换为utf-8没有bom将解决这个问题