我正在构建一个动态的sql文件,可以有英文字符和中文/俄文/越南文等。每个文本摘录都在自己的文件中并正确编码。我需要能够读取每个文件并输出包含所有这些字符的单个文件。我使用perl读入并输出文件。
我的问题分为两部分。
哪种文件编码支持英文文本和非英文文本?
使用perl,我可以自动将输入文件转换为上述编码格式吗?
对于第2部分,我认为我需要以正确的格式读取文件以进行转换。我搜索并发现了Encoding :: Guess,但不确定这是否有效,也不确定如何使用它。
我找到了这个SO Question,第一个答案解释了很多但不是如何?
答案 0 :(得分:2)
piconv -f UTF-16BE -t UTF-8 < input-file > output-file
piconv -f $source_encoding -t UTF-8 < input-file > output-file
piconv,iconv类似工作,是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.txt
和file2.txt
,分别以latin-1和UTF-16BE编码,这个小脚本将读取这两个文件并将输出写入UTF-8编码文件名为output
。