我的情况很奇怪。 在我们的应用程序中,它是用 perl 和 mysql 构建的。我们有 latin1 字符集的遗留表。其中一位用户已将阿拉伯语数据输入到该表中。 当我运行查询从该表中获取详细信息时,它看起来像这样。
أخلاقيات الأØ1Ù...ال الÙ...وضوØ1
在应用程序中,我们有一个显示此内容的页面,并且它正确显示阿拉伯字符。
我们有一个 ETL(提取、转换和加载)过程,它将这些数据转储到另一个星型架构的数据库中。此处此数据保存在 UTF-8 字符集的表中。
现在,当我查询该表时,相同的字段将如下所示
����������������������������������������������������������������������������������������������������������������������������������������������� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
在 UI 中,我们有另一个页面显示新表中的数据。这里的阿拉伯字符没有正确显示。这就是它在前端的显示方式。
أخلاقيات الأØ1Ù...ال الÙ...وضوØ1
上面的文本与我在 MYSQL DB latin1 表中看到的初始输入相似或相同。
如何在页面中正确显示阿拉伯字符。 请帮忙。
最佳答案
一般来说,规则是您应该对来自外部源的文本进行解码,并对发送到外部接收器的文本进行编码。在您的例子中,您正在从数据库中获取看起来像 UTF-8 编码的数据,因此您应该对其进行解码。但看起来它已经被部分解码。看看这个程序
use utf8;
use strict;
use warnings;
use feature 'say';
my $xx = 'أخلاقيات الأعمال الموضوع';
my $yy = 'أخلاقيات الأعمال الموضوع';
utf8::encode($yy);
say length $xx;
say join ' ', map { sprintf '%04X', ord } split //, $xx;
say length $yy;
say join ' ', map { sprintf '%04X', ord } split //, $yy;
输出
46
00D8 00A3 00D8 00AE 00D9 201E 00D8 00A7 00D9 201A 00D9 0160 00D8 00A7 00D8 00AA 0020 00D8 00A7 00D9 201E 00D8 00A3 00D8 00B9 00D9 2026 00D8 00A7 00D9 201E 0020 00D8 00A7 00D9 201E 00D9 2026 00D9 02C6 00D8 00B6 00D9 02C6 00D8 00B9
46
00D8 00A3 00D8 00AE 00D9 0084 00D8 00A7 00D9 0082 00D9 008A 00D8 00A7 00D8 00AA 0020 00D8 00A7 00D9 0084 00D8 00A3 00D8 00B9 00D9 0085 00D8 00A7 00D9 0084 0020 00D8 00A7 00D9 0084 00D9 0085 00D9 0088 00D8 00B6 00D9 0088 00D8 00B9
这显示了您直接从数据库获取的字符串中每个字符的 Unicode 代码点,以及它应该表示的阿拉伯文本以 UTF-8 字节编码。正如您所看到的,除了 0x82 和 0x8A 之间的偶尔值之外,所有内容都匹配得很好,这些值在数据库文本中被替换为宽的其他宽 Unicode 字符,如下所示
0082 => 201A,
0084 => 201E,
0085 => 2026,
0088 => 02C6,
008A => 0160,
很明显,您从数据库中检索的内容应该是 UTF-8 编码的文本,因此它应该只是字节值,所以我很难理解这些宽字符在其中的作用
所以简短的答案是,您应该使用 Encode
和 decode_utf8
从数据库获取的字符串。但那些宽字符会打破这种方法,所以你需要找出为什么你会得到它们
我建议您使用我的程序中以十六进制值转储字符串的行,并在从数据库中提取字符串后直接应用它。
say join ' ', map { sprintf '%04X', ord } split //, $value;
这样我们就可以第一手看到正在发生的事情。事实上,您的程序之间通过 Stack Overflow 服务器到我的桌面进行了大量的编码/解码,而这些阶段中的任何一个都可能是罪魁祸首
关于html - 我需要编码或解码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33259166/