如何在Strawberry Perl中使用unicode读取一个带有长文件名的文件而不使用Win32 :: Unicode :: File?

如何在Strawberry Perl中使用unicode读取一个带有长文件名的文件而不使用Win32 :: Unicode :: File?,第1张

概述我在 Windows XP计算机上有一个位于目录中的文件,其中包含丹麦语字符.我使用Strawberry perl并希望阅读此文件.以下代码工作正常: use Win32::Unicode::File; # Some code left out.... $fname = $mw -> getOpenFile(-filetypes=>$types); my $fh = Win @H_301_2@ 我在 Windows XP计算机上有一个位于目录中的文件,其中包含丹麦语字符.我使用StrawBerry perl并希望阅读此文件.以下代码工作正常:

use Win32::Unicode::file;    # Some code left out....    $fname = $mw -> getopenfile(-filetypes=>$types);    my $fh = Win32::Unicode::file->new;    $fh->open('<',$fname);

getopenfile例程来自Tk.现在由于某种原因,Win32 :: Unicode :: file有一些我不能忍受的不幸副作用(它吃掉了我的记忆,见“Out of memory” with simple Win32::Unicode::File readline loop and Strawberry Perl).现在如果我尝试在没有Win32 :: Unicode :: file接口的情况下打开文件,我会找不到找到的文件.原因是路径被错误地解释了.我已经尝试根据Perl: managing path encodings on Windows转换路径,由于某种原因这不起作用.我该怎么解决这个问题?我尝试过以下方法:

use Encode;    # Some code left out....    $fname = $mw -> getopenfile(-filetypes=>$types);    my $fh;    open($fh,'<',encode("utf8",$fname,Encode::FB_CROAK));

它不起作用.有任何想法吗?

如果我不清楚,请原谅我.

亲切的问候,
迈克尔

解决方法
encode("utf8"

Perl将使用标准的C库IO函数来打开文件,在windows上,文件名本身是Unicode(幕后的UTF-16),这意味着库必须将面向字节的接口中的文件名解释为特定的编码.

这是问题所在:选择的编码绝不是UTF-8或任何其他UTF.它是特定于语言环境的默认编码,已知(误导性地)为ANSI代码页.在西部windows安装上是cp-1252.通常,您可以通过调用Win32 :: codepage :: get_enCoding来了解它是什么.

因此,通过将字符串转换为该编码,只要文件路径中的所有字符都在ANSI代码页中,就可以使用本机文件支持来访问它.对于西方机器上的丹麦人来说还可以.对于中文机器上的丹麦语,反之亦然,您将始终收到文件未找到的错误.

因此,如果你想在windows上支持所有Unicode字符的文件名,你别无选择,只能使用Win32 API,就像Win32 :: Unicode :: file那样.这不是Perl独有的;没有明确支持Unicode文件名的其他语言也有完全相同的问题.

@H_301_2@ 总结

以上是内存溢出为你收集整理的如何在Strawberry Perl中使用unicode读取一个带有长文件名的文件而不使用Win32 :: Unicode :: File?全部内容,希望文章能够帮你解决如何在Strawberry Perl中使用unicode读取一个带有长文件名的文件而不使用Win32 :: Unicode :: File?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1253180.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-07
下一篇2022-06-07

发表评论

登录后才能评论

评论列表(0条)

    保存