簡體   English   中英

Windows Perl->移植后Unix無法正常工作,可能是編碼問題

[英]Windows Perl --> Unix not working after port, possible encoding issue

我有一個在Windows上編寫的Perl程序。 它開始於:

$unused_header = <STDIN>;
my @header_fields = split('\|\^\|', $unused_header, -1);

哪個應拆分包含非常大文件的輸入:

The|^|Quick|^|Brown|^|Fox|!|

進入:

{The, Quick, Brown, Fox|!|}

注意:這條線僅執行headre,還有另一條行重復數據行。

它在Windows上效果很好,但在Linux上卻失敗了。 但是,如果我在Perl中定義了一個具有相同內容的字符串,然后在該字符串上運行split,則可以正常工作。

我認為這是UTF-16編碼處理問題,但我不確定如何處理。 有誰知道我如何獲得perl來了解將UTF-16傳送到STDIN中的方法?

我發現: http : //www.haboogo.com/zh-cn/matching_patterns/2009/01/utf-16-processing-issue-in-perl.html,但是我不確定該如何處理。

如果STDIN為UTF-16,請使用以下之一

binmode(STDIN, ':encoding(UTF-16le)');   # Byte order used by Windows.
binmode(STDIN, ':encoding(UTF-16be)');   # The other byte order.
binmode(STDIN, ':encoding(UTF-16)');     # Use BOM to determine byte order.

湯姆就perl和unicode寫了一個冗長的答案 它包含一些bolierplate代碼以正確並完全支持UTF-8,但是您可以根據需要替換為UTF-16。

我懷疑這是UTF-xx編碼問題,因為Windows Perl和Unix Perl都不會嘗試使用這些編碼讀取數據,除非您告知。

如果Unix腳本正在讀取與Windows腳本完全相同的文件,但是行為有所不同,則可能是行尾問題。 大多數Unix-y系統上的dos2unix命令可以更改文件的行尾,或者您可以在Perl腳本中自己剝離行尾。

$unused_header = <STDIN>;
$unused_header =~ s/\r?\n$//;   # chop \r\n (Windows) or \n (Unix)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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