Curl работает нормально, но Perl LWP не удалось отправить код Unicode на HTTPS-сервер - PullRequest
0 голосов
/ 12 ноября 2018

Мой фрагмент, как показано ниже, используя 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";
}

есть предложения? Спасибо!

1 Ответ

0 голосов
/ 12 ноября 2018

Раньше вы не кодировали. Теперь вы дважды кодируете. 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}";
  • use utf8; my $var = "测试";
  • и т.д.
...