CGI 脚本无法从数据库发送表情符号字符

CGI script having trouble sending emojis characters from database

我将表情符号存储在以 UTF8 字节表示的 MySQL 数据库中,例如 "\xf0\x9f\x98\x80",这是 Unicode 字符 U+1F600 GRINNING FACE

这样复制粘贴进去测试就好了

print MAIL "Subject: \xf0\x9f\x98\x80\n";

有效并向我发送了表情符号。

但是如果我告诉脚本从数据库中获取它并像这样插入它:

print MAIL "Subject: $subject\n";

它将给我主题:\xf0\x9f\x98\x80

我需要做什么?我想如果我以字节为单位存储它,它会将它视为纯文本并且它会起作用。

很可能是您错误地将值添加到数据库中。

如果您使用 Perl 代码并将字符串 '\xf0\x9f\x98\x80' 写入数据库(注意单引号),那么您将得到您所描述的确切症状。您的数据库将包含 sixteen-character ASCII 字符串 \xf0\x9f\x98\x80 并且它会这样显示。

您不应该涉及 UTF-8 编码字节;最好通过名称或数字指定 Unicode 代码点

所有这些都产生相同的 Perl UTF-8 编码字符串

$s = "\N{U+1F600}";
$s = "\N{GRINNING FACE}";
$s = "\x{1F600}";

相应的编码字节与程序员无关,但如果你必须,你可以像这样使用Encode模块

use Encode 'decode_utf8';

$s = decode_utf8 "\xf0\x9f\x98\x80";

另一种方法是将字符直接输入到您的代码中。您将需要 use utf8 向编译器指示源代码包含 non-ASCII UTF-8 编码字符,例如

use utf8;

$s = "";

$s 的所有这些赋值将产生完全相同的结果,并且使用 eq

比较值将相等

在数据库端,您需要一个 MySQL 列,其中包含 four-byte UTF-8 字符集 ,例如

column VARCHAR(50) CHARACTER SET utf8mb4

注意字符集 必须 utf8mb4 就像你使用更早的 utf8 那么你将被限制为 three-byte 编码,而表情符号字符都是四个字节