2011-04-04 100 views
2

在嘗試解碼來自PHP腳本的json_encode函數的Unicode JSON字符串時,我在Perl中遇到了奇怪的行爲。我簡化了問題下面的代碼:在perl中解碼unicode JSON的問題

#!/usr/bin/perl 
use CGI; 
use JSON; 
print CGI::header(-type=>'text/html', -charset=>'UTF-8'); 

print %{ decode_json('{"test_1" : "= \u00F9 ="}') }->{'test_1'}; 
print '<br>'; 
print %{ decode_json('{"test_2" : "= \u00F9 \u0121 ="}') }->{'test_2'}; 

當我在瀏覽器中運行該腳本我看下:

= � = 
= ù ġ = 

第一行包含一個「破字」,第二個是正確的。我認爲碰巧的是,由於某些原因,Perl解碼ISO-8859-1編碼中的第一個字符串,如果我將頁面編碼更改爲ISO-8859-1,第一行是正確的,但是第二行被破壞。

我的Perl版本是5.10.1,JSON版本是2.51。

問題:如何強制Perl json_decode在第一次打印中返回UTF-8字符?

注意:我可以通過手動將第一個輸出轉換爲UTF-8來解決此問題,但這需要安裝額外的「編碼器」模塊,這是我想避免的。

+0

[編碼](http://p3rl.org/Encode)模塊自從v5.7.3開始提供Perl。 – daxim 2011-04-05 22:30:30

回答

4

嘗試了你的代碼,它產生了幾個警告與「使用警告;」

如果你想確保獲得utf8,我相信你必須告訴Perl如此。使用「binmode(STDOUT,」:utf8「);」或類似的。

這適用於命令行:

use strict; 
use warnings; 
use JSON; 

binmode(STDOUT, ":utf8"); 

print decode_json('{"test_1" : "= \u00F9 ="}')->{test_1}; 
print '<br>'; 
print decode_json('{"test_2" : "= \u00F9 \u0121 ="}')->{'test_2'}; 

編輯: AFAIK,這並不影響decode_json(),但是從Perl腳本本身的輸出。 Unicode教程經常告訴你明確說明你想在你的輸入上輸入什麼編碼(文件處理程序)

+0

爲我工作,謝謝 – braz 2011-04-05 11:47:33

+0

然而,奇怪的是,perl無法解碼utf-8默認情況下的「\ u ...」字符 – braz 2011-04-05 11:48:50

+1

不,這不是.. 閱讀http://joelonsoftware.com/文章/Unicode.html,然後http://perldoc.perl.org/perlunitut.html,然後查看http://perldoc.perl.org/perlunifaq.html – 2011-04-06 08:37:43