用户上传文件编码:Cp1252
由于我的mysql表列Collation为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?感谢。
答案 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
。