2014-05-02 20 views
1

我有一個情況我需要的原始郵件文件轉換成JSON和做用用perl有美分OS HTTP POST這個傳輸到遠程服務器6.5在Perl中JSON嵌入二進制數據與美分OS

我已經安裝perl-JSON來自CentOS回購本身,而不是來自CPAN。我提到的原始電子郵件文件可能具有國際字符。它通常是幾百KB的大小。

由於JSON默認不支持二進制數據,我應該如何將原始電子郵件文件嵌入到JSON結構中並執行HTTP POST?

perl-JSON使用perl-JSON-PP,它有方法encode_json(),decode_json(),它期望採用UTF-8格式。

在我的情況下使用安全還是必須將base64編碼的字符串添加到json中?

+0

你需要安全嗎? – Raptor

+0

@Raptor,我正在考慮某些字符可能不符合UTF-8的情況。 – Prabu

+0

是的,我會對郵件進行64位編碼。 –

回答

3

我不會擔心JSON消息本身可能是UTF8編碼,也可能不是。消息的編碼不會影響內容的編碼。

假設我們要傳輸含一次每個字節爲256字節的字符串:當我們編碼

my $string = join '', map chr, 0x00 .. 0xFF; 

和解碼的消息,我們結束了一個等效的字符串再次:

my $message = encode_json { str => $string }; 
my $new_string = (decode_json $message)->{str}; 

$new_string eq $string or die "The strings aren't equal"; 

雖然字符串相同,但它們沒有相同的內容。

use utf8; 
# this may die if the $new_string contains characters outside of 
# the native encoding 
utf8::downgrade($new_string); 

如何以及爲什麼這個工程是非常明確的,但通過使用ASCII唯一編碼裝甲的消息固然可取::

我們可以通過「降級」新的字符串實現這一目標
use MIME::Base64; 
use JSON; 

my $string = join '', map chr, 0x00 .. 0xFF; 

my $message = encode_json { str => encode_base64 $string }; 
my $new_string = decode_base64 decode_json($message)->{str}; 

$string eq $new_string or die; 
+0

謝謝你的解釋。這真的很有幫助。 – Prabu