CGI脚本在从数据库发送表情符号时遇到问题

时间:2018-02-17 05:15:40

标签: mysql perl email cgi emoji

我将emojis存储在以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

我需要做什么?我想如果我以字节存储它,它会将它看作纯文本,它会起作用。

1 个答案:

答案 0 :(得分:3)

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

如果您使用Perl代码并将字符串'\xf0\x9f\x98\x80'写入数据库(请注意单引号),那么您将获得您描述的症状。您的数据库将包含16个字符的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向编译器指示源包含非ASCII UTF-8编码的字符,如下所示

use utf8;

$s = "";

$s的所有这些分配都会产生完全相同的结果,并且值将使用eq进行比较

在数据库方面,你需要一个带有四字节UTF-8字符集的MySQL列,例如

column VARCHAR(50) CHARACTER SET utf8mb4

请注意,字符集必须utf8mb4,就像您使用较早的utf8那样,您将被限制为三字节编码,而表情符号字符全部为四字节