2

我有一个 maven 项目,字符编码在我的父 pom 中设置为 UTF-8。

    <plugin>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>2.3.2</version>
      <configuration>
        <source>1.7</source>
        <target>1.7</target>
        <encoding>UTF-8</encoding>
      </configuration>
    </plugin>

但是在 Java 文件中,使用了一些类似的字符` or,这对我造成了编译错误。

在Eclipse(属性----资源-----文本文件编码和Windows--首选项---工作区---文本文件编码)中,我已将编码指定为UTF-8。请让我知道如何解决此问题。

PERL 代码做转换的东西

use strict;
use warnings;
use File::Find;
use open qw/:std :utf8/;

my $dir = "D:\\files";


find({ wanted => \&collectFiles}, "$dir");

sub collectFiles {
    my $filename = $_;
        if($filename =~ /.java$/){
        #print $filename."\n";
        startConversion($filename);
    }
}

sub startConversion{
    my $filename = $_;
    print $filename."\n";
    open(my $INFILE,  '<:encoding(cp1252)',  $filename) or die $!;
    open(my $OUTFILE, '>:encoding(UTF-8)', $filename) or die $!;
}
4

2 回答 2

1

这两行不会启动或执行重新编码:

open(my $INFILE,  '<:encoding(cp1252)',  $filename) or die $!;
open(my $OUTFILE, '>:encoding(UTF-8)', $filename) or die $!;

打开文件>会截断它,从而删除内容。有关更多详细信息,请参阅open文档

相反,您必须从第一个文件中读取数据(自动对其进行解码),然后将其写回另一个文件(自动对其进行编码)。因为这里的源文件和目标文件是相同的,并且由于 Windows 下文件处理的怪癖,我们应该将输出写入临时文件:

use autodie;  # automatic error handling :)

open my $in,  '<:encoding(cp1252)', $filename;
open my $out, '>:encoding(UTF-8)', "$filename~";  # or however you'd like to call the tempfile
print {$out} $_ while <$in>;  # copy the file, recoding it
close $_ for $in, $out;

rename "$filename~" => $filename;  # BEWARE: doesn't work across logival volumes!

如果文件足够小(提示:源代码通常是),那么您也可以将它们加载到内存中:

use File::Slurp;

my $contents = read_file $filename, { binmode => ':encoding(cp1252)' };
write_file $filename, { binmode => ':encoding(UTF-8)' }, $contents;
于 2013-08-15T16:08:41.350 回答
0

如果您使用的是 Linux 或 Mac OS X,则可以使用iconv将文件转换为 UTF-8。Java 1.7 不允许非 utf8 字符,但 Java 1.6 允许(尽管它会产生警告)。我知道是因为我的 Mac 上有 Java 1.7,因此我无法编译我们的一些代码,而 Windows 用户和我们的 Linux 持续构建机器可以,因为他们都仍然使用 Java 1.6。

您的 Perl 脚本的问题是您打开一个文件进行读取和相同的文件进行写入,但您使用的是相同的文件名。当您打开文件进行写入时,您正在删除其内容。

#! /usr/bin/env perl
use warnings;
use strict;
use feature qw(say);

use File::Find;

use strict;
use warnings;
use autodie;

use constant  {
    SOURCE_DIR       => 'src',
};


my @file_list;
find {
    next unless -f;
    next unless /\.java$/;
    push $file_list, $File::Find::name;
}, SOURCE_DIR;

for my $file ( @file_list ) {
    open my $file_fh, "<:encoding(cp1252)", $file;
    my @file_contents = <$file_fh>;
    close $file_fh;

    open my $file_fh, ">:encoding(utf8)", $file;
    print {$file_fh} @file_contents;
    close $file_fh;
}

注意我正在将整个文件读入内存,这对于 Java 源代码应该没问题。即使是庞大的源文件(10,000 行长,平均行长为 120 个字符)也将超过 1.2 兆字节。除非您使用的是 TRS-80,否则 1.2 兆字节的文件不应该是内存问题。如果您想严格要求,请使用File::Temp创建要写入的临时文件,然后使用File::Copy重命名该临时文件。两者都是标准的 Perl 模块。

您也可以将整个程序包含在find子程序中。

于 2014-07-21T14:00:03.920 回答