首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl ::如何在Windows 10中使用Cyrillic编码?

Perl ::如何在Windows 10中使用Cyrillic编码?
EN

Stack Overflow用户
提问于 2019-11-16 00:42:56
回答 1查看 385关注 0票数 0

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

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

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

一个例子表明:

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

我们会非常感激的。

注意: console input (cp437) to output (cp1251)纯粹是为了演示它涉及的内容以及它是如何正确完成的。

更新:cp437不包含西里尔符号,Perl使用ANSI系统调用CreateFileA,如果没有额外的解决办法,就无法将西里尔字符传递给CreateFileA。我的系统的默认代码页是cp1252,它不包含西里尔符号。

EN

回答 1

Stack Overflow用户

发布于 2019-11-16 02:45:43

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

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

宽接口使用使用UTF-16 The编码的文本。

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

代码语言:javascript
复制
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代码。

相关阅读

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58886452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档