簡體   English   中英

Perl輸出中的JSON編碼

[英]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的專家,因此,任何改進/技巧都將不勝感激。

注意3:我閱讀了此答案 ,並且我的代碼大致基於此答案 主要區別在於我不確定如何編碼文件,而不是簡單的字符串。

網站配置文件是UTF-8編碼的。 這是三種解決方法:

  1. use utf8 pragma放在站點配置文件中。 在主腳本中use utf8編譯指示不足以將do / require包含的文件視為UTF-8編碼。

  2. 如果那不可行,請在將輸入傳遞給JSON編碼器之前對其進行解碼。 就像是

     open CFG, "<:encoding(utf-8)", $conf; do { local $/; eval <CFG> }; close CFG; 

代替

do $conf
  1. 使用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.

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