首页 > 解决方案 > Perl :: 如何在 Windows 10 中使用西里尔文编码?

问题描述

我试图弄清楚如何在 Windows 10 中使用 perl 脚本读取以西里尔文 ( cp437 ) 编码的参数并将其存储在以utf8编码的文本文件中。

在控制台chcp命令返回cp437代码页。

在StackOverflow上搜索返回了几个类似性质的问题。我试图利用从这些帖子中获得的知识,但没有成功。

一个例子说明:

将不胜感激。

注意:控制台输入(cp437)到输出(cp1251)纯粹是为了演示它所涉及的内容以及如何正确完成。

更新:cp437不包含西里尔符号,Perl 使用 ANSI 系统调用 [CreateFileA] 并且在没有额外解决方法的情况下无法将西里尔字符传递到 Perl。我的系统的默认代码页是cp1252,它不包括西里尔符号。

标签: windowsperlcyrillic

解决方案


可以使用“ANSI”接口或使用“Wide”接口从操作系统获取命令行。

ANSI 接口使用使用活动代码页编码的文本。

Wide 接口使用使用 UTF-16le 编码的文本。

Perl 使用 ANSI 接口(例如,尽管您可以通过 Win32:API 访问 Wide 接口)。

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 代码。


相关阅读


推荐阅读