html - 我需要编码或解码吗?

标签 html mysql perl encode utf8-decode

我的情况很奇怪。 在我们的应用程序中,它是用 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 编码的文本,因此它应该只是字节值,所以我很难理解这些宽字符在其中的作用

所以简短的答案是,您应该使用 Encodedecode_utf8 从数据库获取的字符串。但那些宽字符会打破这种方法,所以你需要找出为什么你会得到它们

我建议您使用我的程序中以十六进制值转储字符串的行,并在从数据库中提取字符串后直接应用它。

say join ' ', map { sprintf '%04X', ord } split //, $value;

这样我们就可以第一手看到正在发生的事情。事实上,您的程序之间通过 Stack Overflow 服务器到我的桌面进行了大量的编码/解码,而这些阶段中的任何一个都可能是罪魁祸首

关于html - 我需要编码或解码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33259166/

相关文章:

java - 从数据库中检索数据并用单选按钮显示它,单选按钮包含 struts 1.2 中的数据值

javascript - 无法在 Internet Explorer 中将属性分配给 window.event(或数据属性)

php - 如何从mysql中选择多少列具有相同的值

mysql - 为什么在 "Unknown column ' 中出现错误 'where clause' comp.id' 当我尝试将一个 MySQL 表中的值插入到另一个表中时?

perl - 使用 Putty 到 SSH 忽略 Perl 中的所有警告

javascript - 如何找到离点击位置最近的 child ?

javascript - 独立模式下的 PWA 访问站点设置

mysql - 使用枚举列替代数据库设计,导致性能不佳

php - 将Mysql查询结果放入类内的数组中

perl - 用 Perl 编写支持 Unicode 的单行程序