以编程方式将txt文件从ANSI转换为UTF-8



我需要你的帮助。我正在开发一个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;
    }
}

相关内容

  • 没有找到相关文章

最新更新