最近把播放器的固件升级了,结果歌词全部变成了乱码,中文出现乱码基本都是编码格式的问题。
一个一个的手动修改太麻烦了,就写了一个简单的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包

注意:
1.这套方法需要四个jar包的支持,缺一不可。
小心敲码,大胆运行。
本文介绍了一种使用Java实现批量将文本文件从其他编码格式转换为UTF-8的方法,以解决播放器升级后歌词乱码问题。通过输入目标文件夹路径,程序能显示文件原有编码并完成转换,确保文件正确转为UTF-8。
5671

被折叠的 条评论
为什么被折叠?



