import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
import org.mozilla.intl.chardet.HtmlCharsetDetector;
import org.mozilla.intl.chardet.nsDetector;
import org.mozilla.intl.chardet.nsICharsetDetectionObserver;
import org.mozilla.intl.chardet.nsPSMDetector;
/**
* @author springmvc2006@sina.com
*
*/
public class ChangeFile2UTF8 {
public static void main(String[] args) throws Exception {
String newEncoding = "utf-8"; // 文件新的编码
File oldFileDir = new File("D:/task/input");
String newFileDir = "D:/task/output";
ChangeTask(oldFileDir, newFileDir, newEncoding);
System.out.println("转码为:"+newEncoding+"...成功");
}
/**
* 递归函数
* @param oldFileDir
* @param newFileDir
* @param newEncoding
* @throws Exception
*/
public static void ChangeTask(File oldFileDir, String newFileDir, String newEncoding)throws Exception{
if (oldFileDir.isDirectory()) {
File[] oldFile = oldFileDir.listFiles();
for (int i = 0; i < oldFile.length; i++) {
if(oldFile[i].isFile()){
if(oldFile[i].getName().indexOf(".jar") != -1){
System.out.println(oldFile[i].getName());
continue;
} //jar 文件不要转
String encodingOld = new FileCharsetDetector().guestFileEncoding(oldFile[i], 2);
System.out.println(oldFile[i].getAbsolutePath() +"....."+encodingOld);
//encodingOld = "unicode";
if("windows".toLowerCase().indexOf(encodingOld) != -1){
encodingOld = "unicode";
}else if("Big".toLowerCase().indexOf(encodingOld) != -1){
encodingOld = "gbk";
}else if("nomatch".toLowerCase().indexOf(encodingOld) != -1){
encodingOld = "gbk";
}
saveFile2OtherEncoding(new File(oldFileDir, oldFile[i]
.getName()), newFileDir, encodingOld, newEncoding);
}else{
ChangeTask(oldFile[i], newFileDir+"/"+oldFile[i].getName(), newEncoding);
}
}
}
}
/**
* 转码函数
* @param oldFile
* @param newFilePathString
*/
public static void saveFile2OtherEncoding(File oldFile, String newFileDir,
String oldEncoding, String newEncoding)throws Exception {
FileInputStream fileInputStream = null;
InputStreamReader inputStreamRead = null;
BufferedReader bufferRead = null;
BufferedWriter newFileBW = null;
OutputStreamWriter outputStreamWriter = null;
FileOutputStream fileOutputStream = null;
try {
fileInputStream = new FileInputStream(oldFile);
inputStreamRead = new InputStreamReader(fileInputStream, oldEncoding);
bufferRead = new BufferedReader(inputStreamRead);
createFileName(newFileDir);
File copyFile = new File(newFileDir, oldFile.getName());
fileOutputStream = new FileOutputStream(copyFile, false);
outputStreamWriter = new OutputStreamWriter(fileOutputStream,
newEncoding);
newFileBW = new BufferedWriter(outputStreamWriter);
String strTSVLine = "";
while ((strTSVLine = bufferRead.readLine()) != null) {
if (strTSVLine.equals("")) {
continue;
}
newFileBW.write(strTSVLine+ "\r\n");
//newFileBW.write(strTSVLine.replaceAll("=gbk", "=utf-8")+ "\r\n");
//System.out.println(strTSVLine);
}
} finally {
if (bufferRead != null)
bufferRead.close();
if (newFileBW != null) {
newFileBW.flush();
newFileBW.close();
}
}
}
/**
* 创建文件夹
* @param newFileDir
*/
public static void createFileName(String newFileDir) {
File newFile = new File(newFileDir);
if (!newFile.exists()) {
newFile.mkdirs();
}
}
}
class FileCharsetDetector {
private boolean found = false;
/**
* 如果完全匹配某个字符集检测算法, 则该属性保存该字符集的名称. 否则(如二进制文件)其值就为默认值 null, 这时应当查询属性
*/
private String encoding = null;
public static void mains(String[] argv) throws Exception {
String encoding = new FileCharsetDetector().guestFileEncoding("D:/task/input/GetAllStlrsDocAction.java");
String encodingTwo = new FileCharsetDetector().guestFileEncoding(new File("D:/task/input/GetAllStlrsDocAction.java"), 2);
System.out.println(encoding);
System.out.println(encodingTwo);
}
/**
* 传入一个文件(File)对象,检查文件编码
*
* @param file
* File对象实例
* @return 文件编码,若无,则返回null
* @throws FileNotFoundException
* @throws IOException
*/
public String guestFileEncoding(File file) throws FileNotFoundException,
IOException {
return geestFileEncoding(file, new nsDetector());
}
/**
* 获取文件的编码
*
* @param file
* File对象实例
* @param languageHint
* 语言提示区域代码 eg:1 : Japanese; 2 : Chinese; 3 : Simplified Chinese;
* 4 : Traditional Chinese; 5 : Korean; 6 : Dont know (default)
* @return 文件编码,eg:UTF-8,GBK,GB2312形式,若无,则返回null
* @throws FileNotFoundException
* @throws IOException
*/
public String guestFileEncoding(File file, int languageHint)
throws FileNotFoundException, IOException {
return geestFileEncoding(file, new nsDetector(languageHint));
}
/**
* 获取文件的编码
*
* @param path
* 文件路径
* @return 文件编码,eg:UTF-8,GBK,GB2312形式,若无,则返回null
* @throws FileNotFoundException
* @throws IOException
*/
public String guestFileEncoding(String path) throws FileNotFoundException,
IOException {
return guestFileEncoding(new File(path));
}
/**
* 获取文件的编码
*
* @param path
* 文件路径
* @param languageHint
* 语言提示区域代码 eg:1 : Japanese; 2 : Chinese; 3 : Simplified Chinese;
* 4 : Traditional Chinese; 5 : Korean; 6 : Dont know (default)
* @return
* @throws FileNotFoundException
* @throws IOException
*/
public String guestFileEncoding(String path, int languageHint)
throws FileNotFoundException, IOException {
return guestFileEncoding(new File(path), languageHint);
}
/**
* 获取文件的编码
*
* @param file
* @param det
* @return
* @throws FileNotFoundException
* @throws IOException
*/
private String geestFileEncoding(File file, nsDetector det)
throws FileNotFoundException, IOException {
// Set an observer...
// The Notify() will be called when a matching charset is found.
det.Init(new nsICharsetDetectionObserver() {
public void Notify(String charset) {
found = true;
encoding = charset;
}
});
BufferedInputStream imp = new BufferedInputStream(new FileInputStream(
file));
byte[] buf = new byte[1024];
int len;
boolean done = false;
boolean isAscii = true;
while ((len = imp.read(buf, 0, buf.length)) != -1) {
// Check if the stream is only ascii.
if (isAscii)
isAscii = det.isAscii(buf, len);
// DoIt if non-ascii and not done yet.
if (!isAscii && !done)
done = det.DoIt(buf, len, false);
}
det.DataEnd();
if (isAscii) {
encoding = "ASCII";
found = true;
}
if (!found) {
String prob[] = det.getProbableCharsets();
if (prob.length > 0) {
// 在没有发现情况下,则取第一个可能的编码
encoding = prob[0];
} else {
return null;
}
}
return encoding;
}
}
分享到:
相关推荐
手动逐个修改大量文件显然效率低下,因此出现了专门的批量修改编码软件,如标题所提及的"批量修改文件编码软件"。 该软件允许用户通过拖动文件夹的方式选择需要处理的文件集,然后通过“查找文件”功能搜索特定类型...
本文将深入探讨批量更改文件编码工具的重要性和使用方法,以及它如何为开发人员提供便利。 批量更改文件编码工具,正如其标题所示,是一种能够一次性处理大量文件,将它们的编码格式转换为另一种编码格式的软件。...
下面我们将详细介绍如何实现批量修改文件编码的C#代码: 1. **遍历文件夹**: 首先,我们需要获取指定文件夹及其子文件夹下的所有文件。可以使用DirectoryInfo类和GetFiles方法配合递归实现。 2. **检查文件扩展...
有了这样的批量更改文件编码工具,用户可以指定目标编码(如UTF-8),并选择特定的文件类型(如.txt或.csv),工具会自动完成转换过程,确保所有文件都统一为新的编码格式,从而避免因编码不一致导致的阅读或处理...
此工具可批量修改文件编码(默认gb2312转utf8,可修改) python版本:2.7 使用说明: dirGb2312ToUtf8('F:\work\MyProject\Source\MyProject') 把以上路径改为自己需要转换的文件夹即可
针对批量修改文件编码的需求,这里提供了一个名为“Ansi 2 Utf8.exe”的工具,它能够帮助用户快速地将TXT、CUE等文件从ANSI编码转换为UTF-8编码,反之亦然。这个工具支持的文件扩展名非常广泛,包括.txt、.html、....
批量文件编码转换 只识别文本类文件,识别的是文件头,不是后缀。所以只要是文本文件,无论什么后缀都能识别。如有需要联系 yyxu123@163.com
Qt5.9开发的文件编码转换。该工具我用来在Windows7下面VS2015编译器与MinGW编译器编码转换。MinGW编译器使用UTF-8编码,VS2015使用GB2312编码。 预编译头文件缺失,将头文件替换为 #include #include #include #...
非常好用的一款编码转换软件,批量修改,不论是单文件还是文件夹,直接拖入就可修改成自己希望的编码方式,适合程序员在不同编码格式的电脑直接传输文件时转换,绿色无毒,自用,放心
批量转换文件编码格式为UTF-8工具.zip 支持多层文件夹替换! 使用说明: 1.文件根目录:即您要转码的文件所在根目录 2.转码文件目录:即您转码后的文件所在目录 3.转码文件后缀:指[文件根目录]下,需要转码的文件后缀,...
### Linux下批量修改文件编码 在Linux环境下,批量修改文件编码是常见的操作需求之一,尤其在处理不同系统间文件交互时尤为重要。本文将详细介绍如何在Linux下实现文件编码的批量转换,并通过一个具体示例来展示...
- **注意文件编码的兼容性**:不同的系统和应用程序可能支持不同的编码,确保转换后的编码是广泛兼容的。 - **处理非ASCII字符**:对于包含非ASCII字符(如中文、日文等)的文件,转换时要特别注意,以免出现乱码。...
批量修改文件的编码格式.doc ...其实这样大多是由于文件编码格式不对造成的! 今天从公司拷回来的系统,运行老报JS错,开始发现一个修改一个,但后来工作量太大,又懒得写一个程序,想在网上找找有没有现成的软件。
Emeditor批量修改文件编码格式(UTF-8)-附件资源
"批量修改txt编码"这个主题涉及到的是如何有效地转换大量TXT文本文件的字符编码格式,以便它们能在各种环境下正确显示和处理。这个工具可能是由一个程序员为个人使用而编写的,虽然界面和功能可能相对简洁,但其核心...
### Shell脚本遍历目录并批量修改文件编码 在IT领域中,特别是在处理跨平台文件时,经常会遇到编码格式不一致的问题。例如,从Windows环境移植到Linux环境时,文件编码可能需要从GBK转换为UTF-8。通过编写Shell脚本...
经常碰到文件编码格式不一致导致一堆问题,想在linux上批量修改文件夹下的文件编码,操作太麻烦,花了一点时间写了个java程序来操作,用着非常方便,详情如下: 在FileEncodeTranslate类中,修改一下源文件夹路径,...
本文将深入探讨“文件编码格式批量修改工具”,它是一款专为Windows用户设计的实用程序,旨在帮助用户快速、便捷地将Unicode、UTF-8和GB2312等不同编码格式的文件进行批量转换。 首先,我们要理解各种编码格式的...
本工具名为"批量文件编码转换工具",专门针对那些需要处理大量文件编码问题的用户,能够有效地节省时间和精力。 GB2312编码,全称“中华人民共和国国家标准汉字编码”,是简体中文字符集的一种标准,主要应用于早期...
本文实例讲述了javascript批量修改文件编码格式的方法。分享给大家供大家参考。具体如下: 摘要: 最近在制作手册的时候遇到了一个问题’文档乱码’,查看文件之后发现文件编码不对,总共100多个文件,如果用编辑器...