【问题标题】:Perl i can't decode from utf-8 to greek languagePerl 我无法从 utf-8 解码为希腊语
【发布时间】:2017-10-06 13:03:16
【问题描述】:

我正在从信使平台获取一个 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";
  }



}

这是我从信使平台返回的 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);


%>

【问题讨论】:

  • 我知道我也使用过 eq 但同样的问题。这也是我从信使平台获取的 json,我将文本字段与“Γεια”进行比较:{“object” :"page","entry":[{"id":"434218046923911","time":1494249616799,"messaging":[{"sender":{"id":"1184989524957707"},"recipient":{ "id":"434218046923911"},"timestamp":1494249616387,"message":{"mid":"mid.$cAAGK6wcXaFtiGXz8A1b6DJt38to5","seq":667346,"text":"\\u0393\\u03b5\\ u03b9\\u03b1"}}]}]}
  • 似乎没有,但是当我警告 $message_text 它给了我 utf-8 符号 \xce\x93\xce\xb5\xce\xb9\xce\xb1
  • 它是从错误日志中复制粘贴,json 很好,我用英文字符测试过
  • 你输入的是什么意思??我给你json。
  • 您显示的数据不是有效的 JSON,JSON 模块不会解析它。请使用 use Data::Dumper; $Data::Dumper::Useqq = 1; $Data::Dumper::Terse = 1; print Dumper $json_text; 从 Perl 中转储 $json_text 并向我们展示它的输出。

标签: json perl utf-8


【解决方案1】:
  • 您需要在文件顶部使用 use utf8 来说明其内容是 UTF=8 编码的

  • 您需要将该字符串与eq 进行比较,而不是=,并且您必须添加use warnings 'all' 以警告您此类错误

  • 要打印 UTF-8 数据,您应该使用 characters 并将输出流设置为使用 UTF-8 和 use 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 "Γεια";

输出

DONE-GREEK3

【讨论】:

  • 我使用的是 utf8 和 eq。问题不在于打印,而是像“Γεια”这样的希腊词与我从 json 中获取的文本之间的比较。
猜你喜欢
  • 2015-01-23
  • 2012-06-25
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 2023-03-10
  • 2011-01-01
  • 2017-03-15
  • 2021-03-22
相关资源
最近更新 更多