2012-05-22 51 views
4

我正在抓取網站並從其JSON中收集信息。結果保存在散列表中。但有些頁面給我「JSON字符串中格式錯誤的UTF-8字符」錯誤。我注意到「cafe」中的最後一個字母會產生錯誤。我認爲這是因爲字符類型的混合。所以現在我正在尋找一種方法將所有類型的字符轉換爲utf-8(希望有一種完美的方式)。我試過utf8 :: all,它只是不起作用(也許我沒有這樣做)。我是小白。請幫忙,謝謝。perl:將字符串轉換爲utf-8用於json解碼


UPDATA

好了,經過我讀了一篇文章 「Know the difference between character strings and UTF-8 strings」 發佈由Brian d FOY。我用代碼解決問題:

use utf8; 
use Encode qw(encode_utf8); 
use JSON; 


my $json_data = qq({ "cat" : "Büster" }); 
$json_data = encode_utf8($json_data); 

my $perl_hash = decode_json($json_data); 

希望這對其他人有所幫助。

+0

您可以發佈您迄今爲止所做的工作嗎? – iCanHasFay

+0

我的問題解決了。感謝您的詢問。 –

回答

17

decode_json預計JSON已使用UTF-8編碼。

雖然您的源文件是使用UTF-8編碼的,但您已經使用use utf8;(如您應該)通過Perl對其進行解碼。這意味着您的字符串包含Unicode字符,而不是表示這些字符的UTF-8字節。

正如您所示,您可以在將字符串傳遞給decode_json之前對其進行編碼。

use utf8; 
use Encode qw(encode_utf8); 
use JSON qw(decode_json); 

my $data_json = qq({ "cat" : "Büster" }); 
my $data = decode_json(encode_utf8($data_json)); 

但是你可以簡單地告訴JSON該字符串已經被解碼。

use utf8; 
use JSON qw(); 

my $data_json = qq({ "cat" : "Büster" }); 
my $data = JSON->new->utf8(0)->decode($data_json); 
+1

「但你可以簡單地告訴JSON該字符串已經被解碼。」你的意思是解碼函數的輸入已經編碼爲utf-8嗎? –

+2

這個問題沒有意義。沒有「是」,只有「必須」。是否輸入到$ json-> decode必須是UTF-8編碼或不能編碼取決於你是否使用JSON-> new-> utf8(1) - > decode(又名'decode_json')(輸入必須是UTF-8)或者'JSON-> new-> utf8(0) - > decode'(輸入必須是Unicode字符)。 – ikegami

+0

它的工作原理,謝謝! –