用Java实现文本文件其他编码格式转UTF-8编码格式

本文介绍了一种使用Java实现批量将文本文件从其他编码格式转换为UTF-8的方法,以解决播放器升级后歌词乱码问题。通过输入目标文件夹路径,程序能显示文件原有编码并完成转换,确保文件正确转为UTF-8。

最近把播放器的固件升级了,结果歌词全部变成了乱码,中文出现乱码基本都是编码格式的问题。
一个一个的手动修改太麻烦了,就写了一个简单的java代码来实现批量转换一下。
主要完成的


import info.monitorenter.cpdetector.io.CodepageDetectorProxy;
import info.monitorenter.cpdetector.io.JChardetFacade;
import javafx.scene.shape.Line;

import java.io.*;
import java.nio.charset.Charset;
import java.util.Scanner;

public class EncodingConvertToUTF8 {
    public static void main(String[] args) throws Exception {
        // 输入要转换的文件夹目录
        Scanner sc=new Scanner(System.in);
        String name=sc.nextLine();
        File file = new File(name);
        convertToUTF8(file);
    }
    //开始转换
    private static void convertToUTF8(File file) throws Exception {
        // 判断目标下是不是文件
        if (file.isFile()) {
            // 歌词文件.lrc结尾,进行判断,防止对音频文件进行转换
            if (file.getPath().indexOf(".lrc")==-1) {
                return;
            }
            String path = file.getPath();
            // 创建文件输入流
            FileInputStream fis = new FileInputStream(file);
            // 获取编码方式 。进行判断,跳过UTF-8的文件
            if (!getCharset(file).equals("UTF-8")) {
                convertEncoding(fis,file);
            }
        } else {
            for (File subFile : file.listFiles()) {
                // 递归修改
                convertToUTF8(subFile);
            }
        }
    }
    /**
     * 对文件进行编码转换
     * @param fis
     * @param file
     * @throws Exception
     */
    private static void convertEncoding (FileInputStream fis,File file )throws Exception{
        // 输入流,对文件进行读取
        InputStreamReader isr = new InputStreamReader(fis, getCharset(file));
        BufferedReader br = new BufferedReader(isr);
        StringBuilder sb = new StringBuilder();
        String line = "";
        // 读一行,写一行,换一行
        while ((line=br.readLine())!=null){
            sb.append(line+new Line());
        }
        // 释放流
        br.close();
        isr.close();
        // 删除原文件
        file.delete();
        // 将 StringBuilder 中的流转换成utf-8格式输出
        byte[] utf8Bytes = sb.toString().getBytes("UTF-8");
        // 转换为字符串
        String utf8Str = new String(utf8Bytes, "UTF-8");
        // 重新写入新uft-8文件
        File targetFile = new File(file.getPath());
        FileOutputStream fos = new FileOutputStream(targetFile);
        OutputStreamWriter osw = new OutputStreamWriter(fos, "utf8");
        BufferedWriter bw = new BufferedWriter(osw);
        bw.write(utf8Str);
        bw.close();
        osw.close();
    }
    /**
     * 获取文件编码方式
     * cpdetector_1.0.10.jar
     * 此处需要第三方jar提供支持,可以自行搜索搜索其他方法。或者在官网下载此包。下载链接如下
     * https://sourceforge.net/projects/cpdetector/
     * 另外cpdetector需要 antlr-2.7.4.jar chardet-1.0.jar jargs-1.0.jar 这三个包的支持
     * @param file
     * @return
     * @throws Exception
     */
    public static String getCharset(File file) throws Exception {
        CodepageDetectorProxy detectorProxy = CodepageDetectorProxy.getInstance();
        JChardetFacade facade = JChardetFacade.getInstance();
        detectorProxy.add(facade);
        Charset charset = detectorProxy.detectCodepage(file.toURL());
        System.out.println("当前文件编码格式:"+ charset.name());
        return charset.name();
    }
}

运行效果如下:

目标文件夹。可以不单独把lrc文件放在一起
测试使用的文件夹

在控制台输入目标文件夹路径。
控制台输入目标文件路径
回车运行,可以看到未转换编码前的文件编码格式。
已经完成了格式转换。
转换前的编码格式
再次运行一次程序,看看编码转换是否成功。可以发现已经转换成了UTF-8格式。
这次输出的编码格式实际上是上一次转换后的结果,所以上一次是成功的。确认一下,再看一遍。
转换后的编码格式
依赖的四个jar包
jar包截图
注意:
1.这套方法需要四个jar包的支持,缺一不可。

小心敲码,大胆运行。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值