[英]JSON encoding in Perl output
內容:
我必須將Perl腳本遷移到Python中。 問題在於此Perl腳本使用的配置文件實際上是有效的Perl代碼。 我的Python版本使用.yaml文件作為配置。
因此,我基本上必須在Perl和yaml之間編寫一個轉換器。 從我發現的角度來看,Perl不能與Yaml一起很好地使用,但是有一些庫允許將Perl哈希轉儲到JSON中,並且Python幾乎可以與JSON一起使用,因此我將這種格式用作中介:Perl-> JSON-> Yaml。 第一次轉換是在Perl代碼中完成的,第二次轉換是在Python代碼中的執行(它也對數據進行了一些處理)。
使用@simbabque提到的庫,我可以本地輸出YAML,然后必須對其進行修改和使用。 正如我幾乎不了解Perl一樣,我更喜歡在Python中這樣做。
問題:
源配置文件如下所示:
$sites = {
"0100101001" => {
mail => 1,
from => 'mail@mail.com',
to => 'mail@mail.com',
subject => 'á é í ó ú',
msg => 'á é í ó ú',
ftp => 0,
sftp => 0,
},
"22222222" => {
[...]
還有更多。
我的“解析”代碼如下:
use strict;
use warnings;
# use JSON;
use YAML;
use utf8;
use Encode;
use Getopt::Long;
my $conf;
GetOptions('conf=s' => \$conf) or die;
our (
$sites
);
do $conf;
# my $json = encode_json($sites);
my $yaml = Dump($sites);
binmode(STDOUT, ':encoding(utf8)');
# print($json);
print($yaml);
沒有什么不尋常的。 我只需要Perl數據的JSON YAML版本。 實際上,它大部分都可以工作。 我的問題是編碼。
上面代碼的輸出是這樣的:
[...snip...]
mail: 1
msg: á é à ó ú
sftp: 0
subject: á é à ó ú
[...snip...]
編碼反復無常。 據我所知,UTF-8是默認設置,以防萬一,我使用binmode強制使用它,但無濟於事。
我在這里想念什么? 任何解決方法?
注意:我以為我可能是我的shell,但是locale
輸出如下:
❯ locale
LANG=
LC_COLLATE="C"
LC_CTYPE="UTF-8"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=
好像還可以
注意2:我幾乎不了解Perl,也不打算成為Perl的專家,因此,任何改進/技巧都將不勝感激。
網站配置文件是UTF-8編碼的。 這是三種解決方法:
將use utf8
pragma放在站點配置文件中。 在主腳本中use utf8
編譯指示不足以將do
/ require
包含的文件視為UTF-8編碼。
如果那不可行,請在將輸入傳遞給JSON編碼器之前對其進行解碼。 就像是
open CFG, "<:encoding(utf-8)", $conf; do { local $/; eval <CFG> }; close CFG;
代替
do $conf
JSON::to_json
而不是JSON::encode_json
。 encode_json
需要解碼的輸入(Unicode代碼點),並且輸出是UTF-8編碼的。 to_json
的輸出未編碼,或者將具有與輸入相同的編碼,這就是您想要的。 無需將最終輸出編碼為UTF-8。 使用這三種解決方法中的任何一種都將已經產生UTF-8編碼的輸出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.