windows - Perl :: 如何在 Windows 10 中使用西里尔文编码?
问题描述
我试图弄清楚如何在 Windows 10 中使用 perl 脚本读取以西里尔文 ( cp437 ) 编码的参数并将其存储在以utf8编码的文本文件中。
在控制台chcp
命令返回cp437代码页。
在StackOverflow上搜索返回了几个类似性质的问题。我试图利用从这些帖子中获得的知识,但没有成功。
一个例子说明:
- 如何从控制台(cp437)读取字符串(西里尔文)并将其存储在文件中(utf8)
- 如何读取 utf8 格式(西里尔文)的文件并将内容输出到控制台(cp437)
- 如何从控制台(cp437)读取字符串(西里尔文)并将其输出到控制台(cp1251)
将不胜感激。
注意:控制台输入(cp437)到输出(cp1251)纯粹是为了演示它所涉及的内容以及如何正确完成。
更新:cp437不包含西里尔符号,Perl 使用 ANSI 系统调用 [CreateFileA] 并且在没有额外解决方法的情况下无法将西里尔字符传递到 Perl。我的系统的默认代码页是cp1252,它不包括西里尔符号。
解决方案
可以使用“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 代码。
推荐阅读
- java - 如何编写一个单元测试来测试 Mono 错误?
- php - 更新 WordPress 后在控制台中出现语法错误
- github - 如何将旧更改合并到 Git 存储库中?
- python - 无法从其他工作表复制单元格
- go - 如何检查对象的动态结构中是否存在属性
- java - 即使我们不想提供命令行参数,为什么 JAVA 在 main 函数中需要 String[] 参数?
- python - 如何通过 CharField 过滤对象
- laravel - 为 laravel nova 上的数据透视表属性创建更新操作 belongsToMany 关系
- java - AWS:无法从本地运行的 java 客户端访问端点?
- php - Cloudflare - 激活缓存后登录后重定向不起作用