Postgresql 输入不是UTF-8编码的
我的数据库是Postgresql 输入不是UTF-8编码的,postgresql,perl,dbi,mojolicious,Postgresql,Perl,Dbi,Mojolicious,我的数据库是utf8aware: List of databases Name | Owner | Encoding | Collate | Ctype | -----------+---------------+----------+------------+------------+ tucha | tucha_cleaner | UTF8 | en_US.ut
utf8
aware:
List of databases
Name | Owner | Encoding | Collate | Ctype |
-----------+---------------+----------+------------+------------+
tucha | tucha_cleaner | UTF8 | en_US.utf8 | en_US.utf8 |
当我连接到它时,我设置客户端\u编码
:
my $hm_schema = App::Schema->connect( $dsn, $user, $pass, {
AutoCommit => 1,
RaiseError => 1,
client_encoding => 'UTF8',
}
);
据我所知,返回的值是UTF8:
DBG>$value
["Нд", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"]
DBG>use Devel::Peek
DBG>Devel::Peek::Dump $value
SV = PVMG(0xfe41c20) at 0xfe079b0
REFCNT = 1
FLAGS = (POK,IsCOW,pPOK,UTF8)
IV = 0
NV = 0
PV = 0xfe27550 "[\"\320\235\320\264\", \"\320\237\320\275\", \"\320\222\321\202\", \"\320\241\321\200\", \"\320\247\321\202\", \"\320\237\321\202\", \"\320\241\320\261\"]"\0 [UTF8 "["\x{41d}\x{434}", "\x{41f}\x{43d}", "\x{412}\x{442}", "\x{421}\x{440}", "\x{427}\x{442}", "\x{41f}\x{442}", "\x{421}\x{431}"]"]
CUR = 56
LEN = 58
COW_REFCNT = 4
undef
但是当我试图从Mojo::json
中通过decode_json
解码该字符串时,我得到了错误:
DBG> decode_json $value
ERROR: Input is not UTF-8 encoded at ...
为什么会出现此错误以及如何修复它?字符串的前5个字符如下(十六进制): UTF-8等字符编码是使用字节表示代码点的方法,其中两个字符不是字节,因此您的字符串不可能使用UTF-8进行JSON编码 似乎您有一个已解码的字符串。已删除字符编码以生成Unicode代码点字符串。如果这是您拥有的,请更换
JSON::decode_json($json_utf8)
JSON::MaybeXS::decode_json($json_utf8)
JSON::PP::decode_json($json_utf8)
JSON::XS::decode_json($json_utf8)
Cpanel::JSON::XS::decode_json($json_utf8)
与
顺便说一句,除非您想了解Perl的内部结构,否则Devel::Peek不是适合这项工作的工具。您应该改用Data::Dumper或类似工具
use Data::Dumper qw( Dumper );
# This is the same string as in the OP.
my $value = qq{["\x{41d}\x{434}", "\x{41f}\x{43d}", "\x{412}\x{442}", "\x{421}\x{440}", "\x{427}\x{442}", "\x{41f}\x{442}", "\x{421}\x{431}"]};
local $Data::Dumper::Useqq = 1;
print(Dumper($value));
输出:
$VAR1 = "[\"\x{41d}\x{434}\", \"\x{41f}\x{43d}\", \"\x{412}\x{442}\", \"\x{421}\x{440}\", \"\x{427}\x{442}\", \"\x{41f}\x{442}\", \"\x{421}\x{431}\"]";
对我来说,这些看起来不像是编码字符:如果它们是编码的,你将无法读取它们!改为使用来自json的
。如果您必须猜测输出的含义,请不要使用Devel::Peek
:perl用于表示字符串的内部编码无关紧要。@Borodin:啊,我应该只在ByTestStream上使用decode\u json
use Data::Dumper qw( Dumper );
# This is the same string as in the OP.
my $value = qq{["\x{41d}\x{434}", "\x{41f}\x{43d}", "\x{412}\x{442}", "\x{421}\x{440}", "\x{427}\x{442}", "\x{41f}\x{442}", "\x{421}\x{431}"]};
local $Data::Dumper::Useqq = 1;
print(Dumper($value));
$VAR1 = "[\"\x{41d}\x{434}\", \"\x{41f}\x{43d}\", \"\x{412}\x{442}\", \"\x{421}\x{440}\", \"\x{427}\x{442}\", \"\x{41f}\x{442}\", \"\x{421}\x{431}\"]";