我正在从信使平台上获取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)
您需要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)
| 归档时间: |
|
| 查看次数: |
112 次 |
| 最近记录: |