【问题标题】:Windows Perl --> Unix not working after port, possible encoding issueWindows Perl --> 移植后 Unix 不工作,可能是编码问题
【发布时间】:2012-09-16 10:19:38
【问题描述】:

我有一个在 Windows 上编写的 Perl 程序。开头是:

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

应该拆分包含非常大文件的输入:

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

进入:

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

注意:这条线只做headre,还有另一条类似的做重复的数据线。

它在 Windows 上运行良好,但在 linux 上却失败了。但是,如果我在 Perl 中定义一个具有相同内容的字符串,并在其上运行拆分,它就可以正常工作。

我认为这是一个 UTF-16 编码处理问题,但我不确定如何处理。有谁知道我怎样才能让 perl 理解 UTF-16 被输送到 STDIN 中?

我找到了:http://www.haboogo.com/matching_patterns/2009/01/utf-16-processing-issue-in-perl.html,但我不确定如何处理它。

【问题讨论】:

    标签: windows linux perl encoding port


    【解决方案1】:

    我怀疑这是 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)
    

    【讨论】:

      【解决方案2】:

      Tom 写了一篇关于 perl 和 unicode 的lengthy answer。它包含一些正确且完全支持 UTF-8 的样板代码,但您可以根据需要替换为 UTF-16。

      【讨论】:

        【解决方案3】:

        如果 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.
        

        【讨论】:

        • 好电话,我不得不使用 binmode(STDIN, ':encoding(UTF-16)');在 STDIN 和 STDOUT 上,因为我的文件重写了文件。如果你只是在一个上使用它,如果你有 unicode 字符,你会在打印中出现不匹配。
        猜你喜欢
        • 2019-02-03
        • 2010-11-10
        • 2015-03-03
        • 2019-04-14
        • 2013-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-26
        相关资源
        最近更新 更多