用户上传带有字符编码的文件:Cp1252
由于我的 mysql 表列排序规则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?谢谢。
验证转换过程的一种方法是将字符集解码器和编码器配置为在错误时进行救援,而不是用特殊字符静默替换错误字符:
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"
是否实际上意味着系统的默认编码(以及这是否真的相同)。如有疑问,您可以在实际预期的转换default
→ UTF-8
时使用Charset.defaultCharset()
而不是Charset.forName("windows-1252")
。