gpt4 book ai didi

windows - UTF-16 perl 输入输出

转载 作者:可可西里 更新时间:2023-11-01 13:52:16 29 4
gpt4 key购买 nike

我正在编写一个脚本,它将一个 UTF-16 编码的文本文件作为输入并输出一个 UTF-16 编码的文本文件。

use open "encoding(UTF-16)";

open INPUT, "< input.txt"
or die "cannot open > input.txt: $!\n";
open(OUTPUT,"> output.txt");

while(<INPUT>) {
print OUTPUT "$_\n"
}

假设我的程序将 input.txt 中的所有内容写入 output.txt。

这在我的 cygwin 环境中工作得很好,它使用“这是为 cygwin-thread-multi-64int 构建的 perl 5,版本 14,颠覆 2 (v5.14.2)”

但在我的 Windows 环境中,它使用“这是为 MSWin32-x64-多线程构建的 perl 5,版本 12,颠覆 3 (v5.12.3)”,

除第一行外,output.txt 中的每一行都预先添加了疯狂的符号。

例如:

<FIRST LINE OF TEXT>
਀    ㈀  ㄀Ⰰ ㈀Ⰰ 嘀愀 ㌀ 䌀栀椀愀 䐀⸀⸀⸀  儀甀愀渀最 䠀ഊ<SECOND LINE OF TEXT>
...

谁能解释为什么它在 cygwin 而不是 Windows 上有效?

编辑:按照建议打印编码层后。

在 Windows 环境下:

unix
crlf
encoding(UTF-16)
utf8
unix
crlf
encoding(UTF-16)
utf8

在 Cygwin 环境中:

unix
perlio
encoding(UTF-16)
utf8
unix
perlio
encoding(UTF-16)
utf8

唯一的区别在于 perlio 和 crlf 层。

最佳答案

[ 我本来打算等待并给出一个彻底的答案,但如果我给你一个快速的答案可能比什么都不做要好。 ]

问题是 crlfencoding 层的顺序错误。不是你的错。

例如,假设您使用 UTF-16le 执行 print "a\nb\nc\n";(因为它更简单并且可能是您真正想要的)。你最终会得到

61 00 0D 0A 00 62 00 0D 0A 00 63 00 0D 0A 00

代替

61 00 0D 00 0A 00 62 00 0D 00 0A 00 63 00 0D 00 0A 00

我不认为使用 open pragma 或 binmode 可以获得正确的结果,但可以使用 open 来完成.

open(my $fh, '<:raw:encoding(UTF-16):crlf', $qfn)

您需要在 :utf8 后附加一些旧版本,IIRC。

它适用于 cygwin,因为 crlf 层仅在 Windows 上添加。你会得到

61 00 0A 00 62 00 0A 00 63 00 0A 00

关于windows - UTF-16 perl 输入输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13105361/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com