You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 16:12:24