【问题标题】:Reading Cyrillic characters from file in perl在perl中从文件中读取西里尔字符
【发布时间】:2013-02-02 15:45:31
【问题描述】:

我在从 perl 文件中读取西里尔字符时遇到问题。

文本文件用记事本编写,包含“абвгдежзийклмнопрстуфхцчшщъьюя”。 这是我的代码:

#!/usr/bin/perl

use warnings;
use strict;

open FILE, "text.txt" or die $!;

while (<FILE>) {
    print $_;   
}

如果我使用 ANSI 编码保存文本文件,我会得到:

рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·№■

如果我使用 UTF-8 编码保存它,并使用包 Encode 中的函数 decode('UTF-8', $_),我会得到:

Wide character in print at test.pl line 11, <TEXT> line 1.

还有一堆不可读的字符。

我在 Windows 7x64 中使用命令提示符

【问题讨论】:

  • 文件使用了什么编码?你的终端使用什么编码?
  • 我在 Windows 7 中使用命令提示符
  • 输入 chcp 并将 cp 添加到获得的数字以得到我第二个问题的答案。 (例如 cp437 对我来说。)我的第一个问题呢?
  • 第一个问题:我尝试了 2 种编码 8 位 ansi 和 utf-8。第二题cp866
  • "ANSI" 不是编码。 cp1251,可能。

标签: perl file encoding


【解决方案1】:

您正在对输入进行解码,但“忘记”对输出进行编码。

您的文件可能使用cp1251 编码。

您的终端需要cp866

使用

use open ':std', ':encoding(cp866)';
use open IO => ':encoding(cp1251)';
open(my $FILE, '<', 'text.txt')
   or die $!;

use open ':std', ':encoding(cp866)';
open(my $FILE, '<:encoding(cp1251)', 'text.txt')
   or die $!;

如果您保存为 UTF-8,请使用 :encoding(UTF-8) 而不是 :encoding(cp1251)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    相关资源
    最近更新 更多