我将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
我需要做什么?我想如果我以字节存储它,它会将它看作纯文本,它会起作用。
答案 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
那样,您将被限制为三字节编码,而表情符号字符全部为四字节