将 mysql 数据从 UTF-8 编码为 SMPP 的 UCS-2 时出现 Perl 问题

Perl issue when encoding mysql data from UTF-8 to UCS-2 for SMPP

我正在尝试从 mysql 获取 UTF-8 重音字符“锓ê”,并在通过 SMPP 发送时将它们转换为 UCS-2。数据存储为 utf8_general_ci,我在打开数据库连接时执行以下操作:

$dbh->{'mysql_enable_utf8'}=1;
$dbh->do("set NAMES 'utf8'");

如果我通过使用 data_encoding=8 将字符串值硬编码为“锓ê”来测试发送部分,它会完美地通过。但是,如果我注释掉第一行并只使用来自数据库的内容,它将失败。另外,如果我尝试使用 DB 发送字符并设置 data_encoding=3,它也可以正常工作,但是“ê”不会出现,这也是预期的。这是我使用的:

$fred = 'éêcole'; <-- If I comment out this line, the SMPP call fails
$fred = decode('utf-8', $fred);
$fred = encode('UCS-2', $fred);

$resp_pdu = $short_smpp->submit_sm(
        source_addr_ton => 0x00,
        source_addr_npi => 0x01,
        source_addr => $didnb,
        dest_addr_ton => 0x01,
        dest_addr_npi => 0x01,
        destination_addr => $number,
        data_coding => 0x08,
        short_message => $fred
) or do {
        Log("ERROR: submit_sm indicated error: " . $resp_pdu->explain_status());
        $success = 0;
};

data_coding 字段的不同值如下: Meaning of "data_coding" field in SMPP

00000000 (0) - usually GSM7
00000011 (3) for standard ISO-8859-1
00001000 (8) for the universal character set -- de facto UTF-16

SMPP 提供商的文档还提到特殊字符应通过 UCS-2 处理: https://community.sinch.com/t5/SMS-365-enterprise-service/Handling-Special-Characters/ta-p/1137

我应该如何准备从数据库中出来的数据才能使这个 SMPP 调用起作用?

我正在使用 Perl v5.10.1

谢谢!

$dbh->{'mysql_enable_utf8'} = 1; 用于解码从数据库中 returned 的值,导致对 return 解码文本(Unicode 代码点的字符串)的查询。解码这样的字符串是没有意义的。直奔encode.

my $s_ucp = "\xE9\xEA\x63\x6F\x6C\x65";  # éêcole
# -or-
use utf8; # Script is encoded using UTF-8.
my $s_ucp = "éêcole";

printf "%vX\n", $s_ucp;                  # E9.EA.63.6F.6C.65

my $s_ucs2be = encode('UCS-2', $s_ucp);

printf "%vX\n", $s_ucs2be;               # 0.E9.0.EA.0.63.0.6F.0.6C.0.65

SET NAMES 表示您 have/want 在 客户端 中的编码。也就是说,无论 table 中的编码如何,MySQL 都会将其转换为 SET NAMESSELECT.

中所说的任何内容

因此,将来自 SELECT 的内容直接提供给 SMPP。 (大多数其他客户端无法读取它。)

SET NAMES ucs2

(排序规则与编码无关。)

您可以要求 SELECT 转换为

CONVERT(col_name, CHAR UNICODE)

https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html