将 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 NAMES
在 SELECT
.
中所说的任何内容
因此,将来自 SELECT
的内容直接提供给 SMPP。 (大多数其他客户端无法读取它。)
SET NAMES ucs2
(排序规则与编码无关。)
您可以要求 SELECT
转换为
CONVERT(col_name, CHAR UNICODE)
我正在尝试从 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 NAMES
在 SELECT
.
因此,将来自 SELECT
的内容直接提供给 SMPP。 (大多数其他客户端无法读取它。)
SET NAMES ucs2
(排序规则与编码无关。)
您可以要求 SELECT
转换为
CONVERT(col_name, CHAR UNICODE)