将文件从Cp1252转换为utf -8 java

时间:2015-01-07 10:13:00

标签: java mysql unicode utf-8

用户上传文件编码:Cp1252

由于我的mysql表列Collat​​ion为utf8_bin,我尝试在使用LOAD DATA INFILE命令将数据放入表之前将文件转换为utf-8。

Java源代码:

OutputStream output = new FileOutputStream(destpath);
InputStream input = new FileInputStream(filepath);
BufferedReader reader = new BufferedReader(new InputStreamReader(input, "windows-1252"));
BufferedWriter writ = new BufferedWriter(new OutputStreamWriter(output, "UTF8"));
String in;
while ((in = reader.readLine()) != null) {
    writ.write(in);
    writ.newLine();
}
writ.flush();
writ.close();

似乎没有正确转换字符。转换后的unicode文件在多个位置都有�和框符号。如何有效地将文件转换为uft-8?感谢。

1 个答案:

答案 0 :(得分:2)

验证转换过程的一种方法是配置字符集解码器和编码器以挽救错误,而不是用特殊字符静默替换错误字符:

CharsetDecoder inDec=Charset.forName("windows-1252").newDecoder()
  .onMalformedInput(CodingErrorAction.REPORT)
  .onUnmappableCharacter(CodingErrorAction.REPORT);

CharsetEncoder outEnc=StandardCharsets.UTF_8.newEncoder()
  .onMalformedInput(CodingErrorAction.REPORT)
  .onUnmappableCharacter(CodingErrorAction.REPORT);

try(FileInputStream is=new FileInputStream(filepath);
    BufferedReader reader=new BufferedReader(new InputStreamReader(is, inDec));
    FileOutputStream fw=new FileOutputStream(destpath);
    BufferedWriter out=new BufferedWriter(new OutputStreamWriter(fw, outEnc))) {

    for(String in; (in = reader.readLine()) != null; ) {
        out.write(in);
        out.newLine();
    }
}

请注意,输出编码器在这里配置为对称,但UTF-8能够对每个unicode字符进行编码,但是,一旦您想要使用相同的代码执行其他转换,这样做是有帮助的。

此外,请注意,如果输入文件的编码不同,但误解字节会导致有效字符,则无效。需要考虑的一件事是输入编码"windows-1252"是否实际意味着系统的默认编码(以及它是否真的相同)。如果有疑问,当实际预期的转化为Charset.defaultCharset()Charset.forName("windows-1252")时,您可以使用default代替UTF-8