【问题标题】:Perl :: How work with Cyrillic coding in Windows 10?Perl :: 如何在 Windows 10 中使用 Cyrillic 编码?
【发布时间】:2020-03-12 03:55:13
【问题描述】:

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

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

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

举例说明:

  • 如何从控制台(cp437)读取字符串(西里尔文)并将其存储在文件中(utf8)
  • 如何读取 utf8 格式(西里尔文)的文件并将内容输出到控制台 (cp437)
  • 如何从控制台(cp437)读取字符串(西里尔文)并将其输出到控制台(cp1251)

将不胜感激。

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

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

【问题讨论】:

  • utf8 是 Perl 内部的编码。我相信你的意思是UTF-8

标签: windows perl cyrillic


【解决方案1】:

可以使用“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 字符。

This page 包含执行这些系统调用的 Perl 代码。


Related reading

【讨论】:

  • 我已添加到我的答案中。如果它回答了您的问题,请检查它旁边的标记。如果您删除了除了聊天链接(它将存档 cmets)之外的其他 cmets,那也很好。
猜你喜欢
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多