Perl我无法解码从utf-8到希腊语

-2 perl json utf-8

我正在从信使平台上获取JSON文档,我希望将其$message_text与希腊语单词进行比较.在我从UTF-8解码之后,问题是解码没有发生并且在解码之前和之后$message_text具有相同的值("\xce\x93\xce\xb5\xce\xb9\xce\xb1").这是我现在的代码.

use strict;
use warnings 'all';

use JSON;
use Data::Dumper;
use HTTP::Request::Common;
use LWP::UserAgent;
use CGI;
use HTTP::Daemon;
use HTTP::Status;
use Encode qw(decode encode);
use DBI;
use utf8;
use Encode;


my $message_payload;
my $message_sender_id;


sub decode_json_reply{
  #Decoding the message we recieved from the messenger
  my $json_text = shift;

  warn "Callback_Messages_Testa1:".$json_text;


  my $message_res = JSON::decode_json($json_text);

  my $message_text = $message_res->{entry}[0]->{messaging}[0]->{message}->{text};
  $message_sender_id = $message_res->{entry}[0]->{messaging}[0]->{sender}->{id};
  my $message_recipient_id = $message_res->{entry}[0]->{messaging}[0]->{recipient}->{id};
  $message_payload = $message_res->{entry}[0]->{messaging}[0]->{postback}->{payload};
  my $message_watermark = $message_res->{entry}[0]->{messaging}[0]->{delivery}->{watermark};


  $message_text = Encode::decode_utf8($message_text);


  if("????" eq $message_text){
    warn "DONE-GREEK";
  }



}
Run Code Online (Sandbox Code Playgroud)

这是json我从信使平台回来了

{"object":"page","entry":[{"id":"434218046923911","time":149??4249616799,"messagin??g":[{"sender":{"id":??"1184989524957707"},??"recipient":{"id":"4??34218046923911"},"ti??mestamp":14942496163??87,"message":{"mid":??"mid.$cAAGK6wcXaFtiG??Xz8A1b6DJt38to5","se??q":667346,"text":"\\??u0393\\u03b5\\u03b9\??\u03b1"}}]}]}

<%

my $query = $Request->BinaryRead();


decode_json_reply($query);


%>
Run Code Online (Sandbox Code Playgroud)

Bor*_*din 5

  • 您需要use utf8在文件的顶部说出其内容是UTF = 8编码的

  • 你需要比较字符串eq,而不是=,你必须添加,use warnings 'all'以警告你这样的错误

  • 要打印UTF-8数据,您应该使用字符并将输出流设置为使用UTF-8use open qw/ :std :encoding(utf8) /

  • Perl的内部字符串编码基于UTF-8,因此您不会看到UTF编码字节的输出与未编码的Perl字符之间的任何差异



更新

这是您提供正确结果的代码版本.我使用了我认为记录过程已损坏的原始数据.如果你能发现这个和你自己的代码之间的差异,那么你已经发现了问题

use utf8;
use strict;
use warnings 'all';
use feature 'say';

use JSON 'decode_json';

my $json_text = q<{"object":"page","entry":[{"id":"434218046923911","time":1494253318253,"messaging":[{"sender":{"id":"1184989524957707"},"recipient":{"id":"434218046923911"},"timestamp":1494253317826,"message":{"mid":"mid.$cAAGK6wcXaFtiGbV2wlb6GrnuFJAh","seq":667376,"text":"\u0393\u03b5\u03b9\u03b1"}}]}]}>;

my $message_res = decode_json( $json_text );

my $message_text;

for ( $message_res->{entry}[0]{messaging}[0] ) {

    $message_text = $_->{message}{text};
}

say "DONE-GREEK3" if $message_text eq "????";
Run Code Online (Sandbox Code Playgroud)

产量

DONE-GREEK3
Run Code Online (Sandbox Code Playgroud)