2017-08-24 101 views
-1

我有*TXT文件,其中包含非ASCII字符,例如é ê ù。但*TXT文件模式为ANSI(默认模式)。Perl无法识别非ASCII字符

我在Perl utf8中用于读取非ASCII字符并将其转换为hexadecimal entities

的问题是,如果具有*TXT文件ANSI模式,则Perl不工作,但是*TXT模式是utf8则脚本运行没有问题。

的Perl:

use open ':encoding(utf8)'; 
binmode STDOUT, ':utf8'; 

... 


#assume $amatch contains non-ascii characters 
$amatch = ord($amatch); 
$amatch = sprintf("&#x%x;", $amatch); 

不要任何人有这个解决方案?

+0

你没有表现如何打开并从特定文件中读取数据。但是,如果您从STDIN中读取,则明确设置了代码的第一行,表明您期望数据是UTF8编码的 - 在这种情况下,如果数据不是UTF8编码,那么它当然会失败。 –

+0

我相信诺言不清楚 – ssr1012

+0

提示:常用编码的名称是“UTF-8”。 “UTF8”是你不想要的东西。 – ikegami

回答

2

如果它不是UTF-8,当然如果你告诉Perl它是UTF-8,它当然不起作用!

您的机器的“ANSI”编码可以通过将cp加上Win32::GetACP()返回的编号来获得。

use Win32 qw(); 
my $ansi_enc = "cp".Win32::GetACP(); 
open(my $fh, "<:encoding($ansi_enc)", $qfn) # File encoded using machine's ANSI encoding. 

,而不是

open(my $fh, "<:encoding(UTF-8)", $qfn) # File encoded using UTF-8. 
+0

如何找到ascii并将其转换为Unicode实体 – ssr1012

+0

'while($ tmp =〜m/[^ [:ascii:]]/sg){print“:$ &\n";}'not发现非ascii字符 – ssr1012

+0

请帮助这个 – ssr1012