我正在尝试在Windows上创建带有Unicode字符662f的文件(通过Perl或python,对我来说一切都很好)。在Linux上我能够得到chr是,但在Windows上我得到这个角色æ〜¯,以及一些我怎么也不能得到那个文件名为。
Python代码 -
import sys
name = unichr(0x662f)
print(name.encode('utf8').decode(sys.stdout.encoding))
perl代码 -
my $name .= chr(230).chr(152).chr(175); ##662f
print 'file name ::'. "$name"."txt";
答案 0 :(得分:1)
在Windows上的Perl中,我使用Win32::Unicode
,Win32::Unicode::File
和Win32::Unicode::Dir
。它们与文件名中的Unicode字符完美配合。
请注意,Win32::Unicode::File::open()
(和new()
)具有相反的参数顺序,而Perl的内置open()
- 模式首先出现。
您无需手动编码字符 - 只需按原样插入(如果您的Perl脚本为UTF-8),或使用\x{N}
表示法。
在Windows上将Unicode打印到控制台是另一个问题。您无法使用cmd.exe
。而是使用PowerShell ISE。 ISE的缺点是它不是控制台 - 脚本无法通过STDIN
从键盘输入。
要获得Unicode输出,您需要在每个启动的PowerShell ISE中将输出编码设置为UTF-8。我建议在启动脚本中这样做。
1)为了允许任何用户PowerShell脚本运行,您首先需要执行以下操作:
Set-ExecutionPolicy RemoteSigned
2)编辑或创建Documents\WindowsPowerShell\Microsoft.PowerShellISE_profile.ps1
之类的内容:
perl -w -e "print qq!Initializing the console with Perl...\n!;"
[System.Console]::OutputEncoding = [System.Text.Encoding]::UTF8;
简短的Perl命令是允许修改System.Console
属性的技巧。没有它,设置OutputEncoding
时会出错。
如果我没记错的话,你还必须将字体更改为Consolas。
即使Unicode字符打印正常,您也可能无法在命令行参数中包含它们。在这些情况下,我发现\x{N}
符号有效。 Windows角色地图实用程序是您的朋友。
(在我重新发现常规PowerShell无法显示大多数Unicode字符,并删除了对PowerShell(非ISE)的引用后,编辑得很重。现在我记得为什么我开始使用ISE ...)