我需要你的帮助。我正在开发一个java应用程序,该应用程序将数据从txt文件转换为数据库。问题是,该文件具有ANSI编码,我无法更改,因为它来自我的应用程序外部,当我将数据写入数据库时,我内部有一些"??"。我的问题是,我如何将从文件中读取的数据从ANSI转换为UTF-8,UTF-8可以处理这些错误的符号。我尝试过将Byte[]转换为String,但没有成功。
使用打开这样一个解码阅读器:
Reader reader =
new InputStreamReader(inputStream, Charset.forName(encodingName));
确切地说,你应该使用哪个编码名称取决于文本文件是用哪个"ANSI"编码编写的。你可以在这里找到Java 6支持的编码列表。如果是英语语言系统,则很可能是windows-1252
。
将数据正确写入数据库取决于正确配置数据库,以及(有时)为JDBC驱动程序提供正确的配置。
您可以在此处和此处阅读有关字符编码处理的更多信息
1。什么是ANSI
https://www.cnblogs.com/malecrab/p/5300486.html
2.需要libs
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parsers</artifactId>
</dependency>
3.java示例
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.util.Set;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.tika.Tika;
import org.apache.tika.parser.txt.CharsetDetector;
import org.apache.tika.parser.txt.CharsetMatch;
import com.google.common.collect.Sets;
import lombok.extern.slf4j.Slf4j;
/**
*
* @author wang.qingsong
* Created on 2021/09/16
*/
@Slf4j
public class FileUtil {
public static boolean isFileEncodingUtf8(File inputFile) throws IOException {
return isUtf8(getFileEncoding(inputFile));
}
public static String getFileEncoding(File file) throws IOException {
try (FileInputStream fileInputStream = new FileInputStream(file);) {
return getInputStreamEncoding(fileInputStream);
}
}
public static String getInputStreamEncoding(InputStream input) throws IOException {
CharsetDetector charsetDetector = new CharsetDetector();
BufferedInputStream buffInput = null; // close new BufferedInputStream
try {
charsetDetector.setText(
input instanceof BufferedInputStream ? input : (buffInput = new BufferedInputStream(input)));
charsetDetector.enableInputFilter(true);
CharsetMatch cm = charsetDetector.detect();
return cm.getName();
} finally {
IOUtils.closeQuietly(buffInput);
}
}
public static void convertFileToUtf8(File inputFile, File outputFile) throws IOException {
final String encoding = getFileEncoding(inputFile);
if (StringUtils.isEmpty(encoding)) {
throw new RuntimeException("inputFile encoding can not parsed!");
}
if (isUtf8(encoding)) {
throw new RuntimeException("inputFile is already utf8, no need convert.");
}
if (!outputFile.exists()) {
outputFile.createNewFile();
}
try (FileInputStream inputStream = new FileInputStream(inputFile);
InputStreamReader inputReader = new InputStreamReader(inputStream, encoding);
// output
FileOutputStream outputStream = new FileOutputStream(outputFile);
OutputStreamWriter outputWriter = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8)) {
IOUtils.copy(inputReader, outputWriter);
}
}
private static boolean isUtf8(String encoding) {
final Set<String> aliases = Sets.newHashSet("utf-8", "utf_8", "utf8");
for (String utf8 : aliases) {
if (StringUtils.equalsIgnoreCase(utf8, encoding)) {
return true;
}
}
return false;
}
}