2013-10-28 85 views
1

我有一個腳本,MM.pl,它是「主力」,它是一個簡單的「補丁文件」,它讀取。在這種情況下,修補程序文件將針對.ini文件進行搜索和替換。夠簡單。花了我5天才知道ini在每個字母之間用空字符(\0)編碼。從那以後,我嘗試了所有可以在代碼片段,use::函數和正則表達式中找到的選項。 我發現它的唯一原因是我使用use Data::Printer;來轉儲多個值。在Notepad ++中,ini似乎被編碼爲USC-2 LE。 MM.pl處理任務很重要,而不是要求用戶「解決」問題。刪除或完全填充空字符

更新:這可能提供線索\ xFF \ xFE是ini文件中的前2個字符。它們在處理後出現。交換實際上並沒有改變任何其他方式,但「揭示」了2個隱藏的角色。

回答

8

正如你注意到的那樣,這些空值不僅僅是垃圾被剝離;它們是文件字符編碼的一部分。因此對其進行解碼:

open my $fh, '<:encoding(UCS-2)', 'file.ini'; 

一旦完成,就以相同的方式寫下來。

+1

它可能是UTF-16(樂),而不是UCS-2(樂)。由於UTF-16是UCS-2的超集,因此即使使用UCS-2進行解碼也無妨。 – ikegami

1

當你讀文件設置編碼

my $fh = IO::File->open("< something.ini"); 
binmode($fh, ":encoding(UTF-16LE)"); 

而當你的輸出,你可以寫回哪個enoding你喜歡。例如

my $out = IO::File->open("> something-new.ini"); 
binmode($out, ":encoding(UTF-8)"); 

或者即使你傾倒到終端

binmode(STDOUT, ":encoding(UTF-8)"); 
0

說實話這真的不是一個解決方案,但一個copout。經過4周的嘗試和重試方法,閱讀,閱讀和閱讀,我已經把它放在公園,並切換到python來構建應用程序。 perldocs提到UTF16中的幾個引用是「有問題的」,並且在提及的情況下它被區別對待。