英文和中文文本的文件编码

时间:2013-07-23 14:41:04

标签: sql-server perl file-io character-encoding

我正在构建一个动态的sql文件,可以有英文字符和中文/俄文/越南文等。每个文本摘录都在自己的文件中并正确编码。我需要能够读取每个文件并输出包含所有这些字符的单个文件。我使用perl读入并输出文件。

我的问题分为两部分。

  1. 哪种文件编码支持英文文本和非英文文本?

  2. 使用perl,我可以自动将输入文件转换为上述编码格式吗?

  3. 对于第2部分,我认为我需要以正确的格式读取文件以进行转换。我搜索并发现了Encoding :: Guess,但不确定这是否有效,也不确定如何使用它。

    我找到了这个SO Question,第一个答案解释了很多但不是如何

2 个答案:

答案 0 :(得分:2)

piconv -f UTF-16BE         -t UTF-8 < input-file > output-file
piconv -f $source_encoding -t UTF-8 < input-file > output-file

piconviconv类似工作,是Encode的一部分,随Perl一起提供。

要检测源编码,请使用比Encode :: Guess更好的模块。见How can I guess the encoding of a string in Perl?

答案 1 :(得分:1)

回答上一条评论中的问题,以下是如何从一种编码转换为另一种编码:

#!/usr/bin/perl
use strict;
use warnings;

sub read_encoded {
    my $file_name = shift;
    my $encoding  = shift;

    my $content;
    if ( open my $fh, "<:encoding($encoding)", $file_name ) {
        $content = do {
            local $/;
            <$fh>;
        };
    }
    else {
        die "Could not open $file_name: $!";
    }

    return $content;
}

sub write_file {
    my $file_name = shift;
    my $content   = shift;

    if ( open my $fh, '>:encoding(UTF-8)', $file_name ) {
        print $fh $content;
    }
    else {
        die "Could not open $file_name: $!";
    }
}

my $content1 = read_encoded( 'file1.txt', 'latin-1' );
my $content2 = read_encoded( 'file2.txt', 'UTF-16BE' );

write_file( 'output', $content1 . $content2 );

假设您有两个文件file1.txtfile2.txt,分别以latin-1和UTF-16BE编码,这个小脚本将读取这两个文件并将输出写入UTF-8编码文件名为output