Curl工作正常,但Perl LWP无法将Unicode代码发布到HTTPS服务器

Curl工作正常,但Perl LWP无法将Unicode代码发布到HTTPS服务器,perl,curl,unicode,https,lwp,Perl,Curl,Unicode,Https,Lwp,我的代码片段如下所示,使用curl可以将Unicode字符串发送到服务器 并在将通知信息推送到我的手机后,正确显示手机上的汉字 curl "https://oapi.dingtalk.com/robot/send?access_token=$ACCESS_TOKEN" \ -H 'Content-Type: application/json' \ -d '{"msgtype": "text", "text": { "content": "\u6d4b\u

我的代码片段如下所示,使用curl可以将Unicode字符串发送到服务器 并在将通知信息推送到我的手机后,正确显示手机上的汉字

      curl  "https://oapi.dingtalk.com/robot/send?access_token=$ACCESS_TOKEN" \
   -H 'Content-Type: application/json' \
   -d '{"msgtype": "text", "text": {
        "content": "\u6d4b\u8bd5",
     }}' 
但是当我使用Perl LWP库将相同的内容发送到服务器时, 我只在应用程序上显示了6d4b8bd5。 我尝试使用tcpdump来比较curl和LWP发送缓冲区之间的差异,但由于它是https服务器,所以无法工作

    #!/usr/bin/perl -w
use strict;
use warnings;
use Cpanel::JSON::XS qw( encode_json );
# Create a user agent object
use LWP::UserAgent;
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;

my $ua = LWP::UserAgent->new;
$ua->agent("curl/7.47.0");


# Create a request
my $req = HTTP::Request->new(POST => 'https://oapi.dingtalk.com/robot/send?access_token=bf47148ea6a1b125395f9313873ac508');

$req->content_type('application/json;charset=utf-8');

my $var='\u6d4b\u8bd5';

my $message = encode_json({ msgtype => "text", text => { content => $var } });

$req->content($message);

# Pass request to the user agent and get a response back
my $res = $ua->request($req);

# Check the outcome of the response
if ($res->is_success) {
  print $res->content;
} else {
  print $res->status_line, "n";
}

有什么建议吗?谢谢

之前,您没有编码。现在,你需要双重编码
encode_json
已经在处理对json的编码,所以也不要手动执行

如果您提供12个字符
\u6d4b\u8bd5
,它将接收12个字符
\u6d4b\u8bd5

如果您提供两个字符U+6D4B和U+8BD5,它将接收两个字符U+6D4B和U+8BD5

  • my$var=chr(0x6D4B)。chr(0x8BD5)
  • my$var=“\x{6D4B}\x{8BD5}”
  • my$var=“\N{U+6D4B}\N{U+8BD5}”
  • 使用utf8;我的$var=”测试";

之前,您没有进行编码。现在,您进行了双重编码。
encode\u json
已经在处理对json的编码,所以也不要手动执行

如果您提供12个字符
\u6d4b\u8bd5
,它将接收12个字符
\u6d4b\u8bd5

如果您提供两个字符U+6D4B和U+8BD5,它将接收两个字符U+6D4B和U+8BD5

  • my$var=chr(0x6D4B).chr(0x8BD5);
  • my$var=“\x{6D4B}\x{8BD5}”
  • my$var=“\N{U+6D4B}\N{U+8BD5}”
  • 使用utf8;我的$var=”测试“;

谢谢!这意味着encode_json api不支持使用\u6d4b\u8bd5格式,必须使用您上面提到的格式。如果我想坚持使用\u6d4b\u8bd5,那么我必须找到另一种方法在内部json值中传递变量。有没有建议使用\u6d4b\u8bd5字符串格式作为数据库格式?请使用--trace-ascii/dev/stdout with curl我可以看到curl正在向https服务器发送“内容”:“\u6d4b\u8bd5”。如果您检查了代码的输出(以及我的更改),您还可以在输出中看到
\u6d4b\u8bd5
。同样,让
encode\u json
处理json编码!如果数据库中有
\u6d4b\u8bd5
,则表明您做错了什么。您不应该在json之外看到
\u6d4b\u8bd5
。也许您做了一些劣质的手动解析,而不是使用
decode\u json
>或者类似的?(当然,如果数据库字段包含正确的JSON,那么获取所需值的第一步就是
解码\u JSON
或者类似的内容。)\u6d4b\u8bd5来自另一个REST api,例如182383:\u6d4b\u8BD5182384:\u7a4b\u2bd5等,该列表可从网站获得。然后我将列表保存在本地JSON数组中,并使用数字键查找其值并将其发送到我的后端服务器,该服务器将推送到注册的应用程序。谢谢!这意味着encode\u JSON api无法支持我们正在使用\u6d4b\u8bd5格式,并且必须使用您上面提到的格式。如果我想继续使用\u6d4b\u8bd5,那么我必须找到另一种方法在内部json值中传递变量。是否建议使用\u6d4b\u8bd5字符串格式作为数据库格式?使用--trace ascii/dev/stdout with curl我可以看到curl正在发送“内容“:“\u6d4b\u8bd5”发送到https服务器。如果您检查了代码的输出(带有我的更改),您还可以在输出中看到
\u6d4b\u8bd5
。同样,让
encode\u json
处理json编码!如果数据库中有
\u6d4b\u8bd5
,则表明您做错了什么。您不应该在json之外看到
\u6d4b\u8bd5
。也许您做了一些劣质的手动解析,而不是使用
decode\u json
>或者类似的?(当然,如果数据库字段包含正确的JSON,那么获取所需值的第一步就是
解码\u JSON
或者类似的内容。)\u6d4b\u8bd5来自另一个REST api,例如182383:\u6d4b\u8BD5182384:\u7a4b\u2bd5等,该列表可从网站获得。然后我将该列表保存在本地JSON数组中,并使用数字键查找其值并将其发送到我的后端服务器,该服务器将推送到已注册的应用程序。