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 编码,而表情符号字符都是四个字节
我将表情符号存储在以 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 编码,而表情符号字符都是四个字节