簡體   English   中英

輸入不是UTF-8編碼的

[英]Input is not UTF-8 encoded

我的數據庫支持utf8

                                   List of databases
   Name    |     Owner     | Encoding |  Collate   |   Ctype    |
-----------+---------------+----------+------------+------------+
 tucha     | tucha_cleaner | UTF8     | en_US.utf8 | en_US.utf8 | 

當我連接到它時,我設置client_encoding

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::JSONdecode_json解碼該字符串時,出現錯誤:

DBG> decode_json $value
ERROR: Input is not UTF-8 encoded at ...

為什么我會收到該錯誤以及如何解決?

字符串的前5個字符如下(十六進制):

5B 22 41D 434 22

諸如UTF-8的字符編碼是使用字節表示代碼點的手段,而其中兩個字符不是字節,因此您的字符串不可能使用UTF-8進行JSON編碼。

看來您有一個解碼的字符串。 字符編碼已被刪除,以產生一個Unicode Code Points字符串。 如果是這樣,請更換

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)

JSON->new->decode($json_ucp)    -or-    JSON::from_json($json_ucp)
JSON::MaybeXS->new->decode($json_ucp)
JSON::PP->new->decode($json_ucp)
JSON::XS->new->decode($json_ucp)
Cpanel::JSON::XS->new->decode($json_ucp)

順便說一句,除非您想了解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}\"]";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM