我试图找出如何在Windows 10中使用perl脚本读取用西里尔语(cp437)编码的参数,并将其存储在utf8编码的文本文件中。
在控制台中,chcp命令返回cp437代码页。
搜索StackOverflow返回了几个类似性质的问题。我试着利用从这些职位上获得的知识,但没有成功。
一个例子表明:
我们会非常感激的。
注意: console input (cp437) to output (cp1251)纯粹是为了演示它涉及的内容以及它是如何正确完成的。
更新:cp437不包含西里尔符号,Perl使用ANSI系统调用CreateFileA,如果没有额外的解决办法,就无法将西里尔字符传递给CreateFileA。我的系统的默认代码页是cp1252,它不包含西里尔符号。
发布于 2019-11-16 02:45:43
命令行可以使用"ANSI“接口或使用"Wide”接口从操作系统中获得。
ANSI接口使用使用活动代码页编码的文本。
宽接口使用使用UTF-16 The编码的文本。
Perl使用ANSI接口(例如,您可以通过Win32 32:API访问宽接口)。
use Encode qw( decode );
use Win32 qw( );
my $acp = "cp".Win32::GetACP();
@ARGV = map { decode($acp, $_) } @ARGV;
open(my $fh, '>:encoding(UTF-8)', $qfn)
or die("Can't create \"$qfn\": $!\n");
print($fh "$_\n") for @ARGV;需要注意的是,控制台使用的编码(如chcp所示)与活动代码页不相同。这意味着@ARGV只能包含OEM代码页(控制台使用的编码)和活动代码页( ANSI接口使用的编码)中的字符。
要消除这一限制,可以使用系统调用的宽接口从命令行(GetCommandLineW)获取参数,并使用系统调用的宽接口来解析命令行(CommandLineToArgvW)。这将提供参数,无论控制台使用什么编码。在控制台中使用代码页65001后,可以在参数中使用任何Unicode字符。
此页包含用于进行系统调用的Perl代码。
https://stackoverflow.com/questions/58886452
复制相似问题