如何使用俄语单词修复UTF-8编码错误

时间:2018-12-11 08:54:07

标签: perl unicode utf-8

我的Perl脚本从一个文本文件读取,该文件主要包含英语ANSI单词。 但是有时候会有俄语单词,我无法将其转换回UTF-8。

请参见同一示例(括号中的单词为英文翻译):

Êîìïîíåíò (Component)
Àâòîð (Author)
Ãýíäàëüô (Gandalf)
Äàòà ñîçäàíèÿ (Create date): 20-ìàé(may)-2003
Äàòà êîððåêöèè (Last correction Date): 25-ìàð(mar)-2003
Âåðñèÿ (Version): 0.92
Áëàãîäàðíîñòè (Thanks):
Íîâîå â (New in):
Ïîääåðæêà (Support)
Î÷åíü ìíîãî (Very much)

我已阅读UTF-8 Encoding Debugging Chart,并尝试了以下方法

$s='Àâòîð';
from_to($s, "iso-8859-5","utf-8");  
print "$s\n";

my $s = Encode::decode( 'iso-8859-5', 'Àâòîð' );
from_to($s, "iso-8859-5","utf-8");  
print "$s\n";

我也尝试了cp1252而不是iso-8859-5,但没有任何帮助。 我也尝试了Encode :: Guess,但结果没有帮助:iso-8859-5 or cp1251 or koi8-r or iso-8859-1

有什么主意如何将“Àâòîð”转换回西里尔文字“автор”?

2 个答案:

答案 0 :(得分:2)

经过一些尝试,将(Windows)控制台代码页切换到65001(UTF-8)并从df3 = df1.merge(df2,how='outer',on='ID',suffixes=['','_x']) overlapping_months_sufx = df3.columns.values[df3.columns.str.endswith('_x')] for mnth_sufx in overlapping_months_sufx: mnth = mnth_sufx[:-2] df3[mnth][df3[mnth_sufx].notnull()] = df3[mnth].fillna(0) + df3[mnth_sufx] df3=df3.drop(columns=mnth_sufx) df3 = Month Dec Nov Oct ID XXX 4.0 1.0 NaN YYY 13.0 8.0 0.0 ZZZ 4.0 1.0 NaN AAA 1.0 7.0 9.0 BBB 0.0 NaN 2.0 解码输入数据时,我得到了预期的输出Автор

Windows-1251

这表明输入数据被编码为perl -MEncode -wle "print encode('UTF-8',decode('Windows-1251',shift))" "Àâòîð" ,并从中进行解码应为您提供Unicode的西里尔字母。要将数据输出到文件,请确保在打开文件时设置编码(最简单),或者将每个字符串Windows-1251设置为输出的目标编码(很难跟踪):

encode

答案 1 :(得分:1)

您的字节序列为0xc0 0xe2 0xf2 0xee 0xf0。这是cp1251中的俄语单词'author'。如果您的应用程序假定这是cp1252编码,则可以得到您给出的表示形式。现在的问题是,您想拥有什么代码页?或者,您的应用程序需要什么代码页?

要以正确的方式读取cp1251中的文件,您必须使用以下结构:

open (my $tmp_h,"<:encoding(cp-1251)", $ARGV[0]) or die $!; 

这使perl知道您在文件中使用什么代码页。然后,当您将文件读取为字符串时,它允许perl正确地将值从cp1251转换为Perl的内部格式(UTF-8),并根据需要使用这些字符串而不会出现任何问题。

对于内部表单perl设置的UTF8标志,可以使用Devel :: Peek模块进行检查。

我认为,使用内部格式也将使您有机会正确使用任何字符串操作,并有助于避免错误。

我建议在我们的源代码中使用“ use utf8”编译指示。现在,源代码中的所有文字都会受到utf8的威胁,并会自动正确转换为内部形式。现在,我们知道我们的源代码在UTF8中(如果使用BOM,它也会更好,因为通常情况下检测BOM是不同的IDE和编辑器通常要做的第一件事)。以后,我们可以使用“ <:encoding(....)”构造以任何编码打开其他文件,从Web上从数据库中获取数据,并再次确保已正确检查utf8标志将数据转换为内部格式。有了所有这些,我们将能够以一种方式处理所有这些数据,正确地比较字符串,使用正则表达式等。