Perl读取含越南语JSON文件时decode_json报宽字符警告求助
解决Perl读取含越南语JSON文件时的Wide Character警告
问题原因
你遇到的Wide character in subroutine entry警告,核心矛盾在于:
decode_json(以及JSON->new->utf8->decode())要求输入UTF-8编码的字节串- 当你用
<:encoding(UTF-8)打开文件时,读取到的是Perl内部的已解码Unicode字符串(宽字符),不符合decode_json的输入要求
而直接写在脚本里的JSON字符串能正常工作,是因为该字符串以UTF-8字节形式存储在脚本中,属于decode_json期望的字节串类型。
两种解决方案
方案1:读取文件时不做解码,直接获取UTF-8字节串
打开文件时不指定编码,直接读取原始字节流,再交给decode_json处理:
use strict; use warnings; use JSON; binmode(STDOUT, ":encoding(UTF-8)"); my $json; { local $/; open my $fh, '<', $ARGV[0] or die "Can't open file: $!"; $json = <$fh>; } my $decoded_json = decode_json($json); print $decoded_json->{content}, "\n";
方案2:使用from_json处理已解码的Unicode字符串
from_json专门用于处理Perl内部的Unicode字符串,对应JSON->new->utf8(0)->decode(),可以直接对接用:encoding(UTF-8)读取的内容:
use strict; use warnings; use JSON; binmode(STDOUT, ":encoding(UTF-8)"); my $json; { local $/; open my $fh, "<:encoding(UTF-8)", $ARGV[0] or die "Can't open file: $!"; $json = <$fh>; } my $decoded_json = from_json($json); print $decoded_json->{content}, "\n";
关键区别
decode_json:处理UTF-8编码的原始字节串from_json:处理Perl内部已解码的Unicode字符串
之前尝试的JSON->new->utf8->decode()无效,正是因为它和decode_json一样要求字节串输入,而你传入的是已解码的宽字符。
内容的提问来源于stack exchange,提问作者minhnn
相关产品推荐
相关产品推荐

