package com;
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.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
/**
* Java:判断文件的编码 首先,不同编码的文本,是根据文本的前两个字节来定义其编码格式的。定义如下:
*
* ANSI: 无格式定义
* Unicode: 前两个字节为FFFE Unicode文档以0xFFFE开头
* Unicode big endian: 前两字节为FEFF
* UTF-8: 前两字节为EFBB UTF-8以0xEFBBBF开头
*
* 知道了各种编码格式的区别,写代码就容易了
*
* 转自:http://www.cppblog.com/biao/archive/2009/11/04/100130.aspx
*
*/
public class FileEncodType {
public static void main(String[] args) {
File file = new File("D:\\unb.txt");
String str = FileEncodType.getFilecharset(file);
System.out.println(str);
fileEncodingToANSI(file,str);
}
/**
* 将指定文本文件转换为ANSI 编码类型
* @param sourceFile 指定文本文件
* @param encoding 指定文本文件原始编码
*/
protected static void fileEncodingToANSI(File sourceFile,String encoding){
try {
BufferedReader bufRead = new BufferedReader(new InputStreamReader(new FileInputStream(sourceFile),encoding));
if(encoding.equals("GBK") == false){
//文件编码非ANSI跳过1个字节,避免文件起始出现 ?
bufRead.skip(1);
}
BufferedWriter bufWriter = new BufferedWriter(new FileWriter("D:\\Test.txt"));
String str = null;
while((str = bufRead.readLine()) != null){
//写入文件
bufWriter.write(str+"\r\n");
}
bufRead.close();
bufWriter.flush();
bufWriter.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Java:判断文件的编码
*
* @param sourceFile 需要判断编码的文件
* @return String 文件编码
*/
protected static String getFilecharset(File sourceFile) {
String charset = "GBK";
byte[] first3Bytes = new byte[3];
try {
//boolean checked = false;
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream(sourceFile));
bis.mark(0);
int read = bis.read(first3Bytes, 0, 3);
System.out.println("字节大小:"+read);
if (read == -1) {
return charset; //文件编码为 ANSI
} else if (first3Bytes[0] == (byte) 0xFF
&& first3Bytes[1] == (byte) 0xFE) {
charset = "UTF-16LE"; //文件编码为 Unicode
//checked = true;
} else if (first3Bytes[0] == (byte) 0xFE
&& first3Bytes[1] == (byte) 0xFF) {
charset = "UTF-16BE"; //文件编码为 Unicode big endian
//checked = true;
} else if (first3Bytes[0] == (byte) 0xEF
&& first3Bytes[1] == (byte) 0xBB
&& first3Bytes[2] == (byte) 0xBF) {
charset = "UTF-8"; //文件编码为 UTF-8
//checked = true;
}
bis.reset();
/*if (!checked) {
int loc = 0;
while ((read = bis.read()) != -1) {
loc++;
if (read >= 0xF0)
break;
if (0x80 <= read && read <= 0xBF) // 单独出现BF以下的,也算是GBK
break;
if (0xC0 <= read && read <= 0xDF) {
read = bis.read();
if (0x80 <= read && read <= 0xBF) // 双字节 (0xC0 - 0xDF)
// (0x80
// - 0xBF),也可能在GB编码内
continue;
else
break;
} else if (0xE0 <= read && read <= 0xEF) {// 也有可能出错,但是几率较小
read = bis.read();
if (0x80 <= read && read <= 0xBF) {
read = bis.read();
if (0x80 <= read && read <= 0xBF) {
charset = "UTF-8";
break;
} else
break;
} else
break;
}
}
// System.out.println( loc + " " + Integer.toHexString( read )
// );
}*/
bis.close();
} catch (Exception e) {
e.printStackTrace();
}
return charset;
}
}
分享到:
相关推荐
- **编码转换**:当读取文件后,如果需要将不同编码的文本转换为统一的编码(如UTF-8),可以使用Java中的`InputStreamReader`或`OutputStreamWriter`类进行编码转换。 - **异常处理**:在处理文件时可能会遇到各种...
- 使用Java的`String.getBytes()`方法,指定目标Ansi编码,将Ansi字符串转换为字节数组。 - 使用`new String(bytes, "UTF-8")`将字节数组转换回Unicode字符串。 3. Unicode字符串转换到ANSI(Android): - 使用...
如:我要转换E盘下 E:\work_architecture\doc目录下的所有js 和 css 文件 编码为 utf-8 那么,你要执行的命令就是 java -jar code_conversion.jar "E:\work_architecture\doc" "utf-8" ".js .css" 还是挺简单的吧~~...
- 将文件内容读入内存并转换为新的目标编码。 - 写回转换后的内容到原文件或新文件。 这样的工具对多语种网站的开发者和维护者尤其有用,因为它们可以快速地处理大量文件,节省手动修改的时间和减少出错的可能性。...
3. **对于已存在的Java文件**,如果之前保存时使用的是GBK编码格式,并且在编译时出现了乱码问题,可以通过转换文件的编码格式来解决。 - 将文件另存为ANSI格式。尽管这种方法看起来简单粗暴,但它实际上是一种有效...
总结一下,将Android手机端的Unicode字符串转换为Ansi编码,需要理解各种编码的特性,掌握Delphi中的编码转换方法,以及熟悉Android的JNI接口。通过上述步骤,可以实现跨平台的字符编码兼容,确保数据的正确传输和...
因此,需要将文件的编码格式转换为 UTF-16,以解决乱码的问题。 解决方案是使用 InputStreamReader 对象来读取文件,并将编码格式设置为 UTF-16。这样,乱码的问题就得到了解决。 在文章中,还提供了一些关于 TXT ...
3. **转换过程**:使用对应的解码器将文件内容从原编码转换为Unicode,然后用UTF-8编码器重新编码。 4. **保存结果**:将转换后的内容写入新文件,通常在原文件名基础上加上标识符,以保留原始文件。 压缩包子文件...
然而,在处理旧的、仅支持ANSI编码的系统或文件时,可能需要进行编码转换。 总结来说,理解和掌握UTF-8与ANSI字符编码的差异,以及如何进行转换,对于解决跨平台、多语言环境下的文本处理问题至关重要。在日常工作...
总是遇到文件编码不一致的情况,自己抽时间用java开发了一款编码转换小工具,已封装成exe,图形化操作界面,内置使用说明,欢迎下载使用。 支持批量转换 支持单个文件转换 支持gb2312、gbk(ansi)、gb18030、utf-8、...
可以使用getBytes()方法将字符串转换为字节数组,并指定编码格式为UTF-16LE。例如: ```java String[] heads = {"日期", "产品", "订单数"}; String[][] rows = {{"20150228", "安卓", "23"}, {"20150301", "web", ...
在探讨Java字符集和编码之前,我们先了解一下为什么在Java编程中需要关注字符集和编码。Java作为一种广泛应用的编程语言,其内部采用的是Unicode编码,这使得Java能够很好地支持全球化的应用开发。然而,在实际的...
在易语言环境下,可以使用“字符串转换”命令系列进行编码转换。例如,可以先使用“字符串到字节序列”将Ansi字符串转换为字节数组,然后使用“字节序列到字符串”配合指定的UCS-2编码进行转换。反之,从UCS-2到Ansi...
Apache Commons项目中的DBF库提供了一套工具类,可以解析DBF文件并将其转换为Java对象。通过`DbfReader`类,可以打开DBF文件,获取字段信息,并迭代记录进行处理。 5. **代码示例**: 使用JDBF库读取DBF文件的...
接下来,CPU将缓冲区的数据读入内存,并在这一过程中调用编码转换函数,将GBK编码的“眼泪”转换为Unicode编码(FFFE 3C77 EA6C)。随后,为了在屏幕上显示该字符,CPU再次调用编码转换函数,将内存中的Unicode编码...
java读写excel包括utf8转码为可识别汉字gbk,jxl方式读取excel,生成一个新的excel
在这个问题中,我们需要将大量的JAVA源代码文件从ANSI编码转换为UTF-8编码。ANSI编码是一种与系统区域设置相关的编码方式,通常在Windows系统中,ANSI对应于Windows默认的本地编码,如GBK或GB2312。而UTF-8是一种更...
由于提供的文件内容包含了技术性质的详细说明,所以本段落将根据提供的文档内容概述Java中的编码知识,同时纠正识别错误并补充遗漏,确保知识的连贯性和准确性。 首先,文档中提到了Java中与字符编码相关的基本概念...
Java IO流文件编码是Java语言中的一种文件编码方式,它可以将文件转换成不同的编码格式,以便在不同的平台和系统中使用。在Java中,文件编码可以使用不同的方式,包括使用getBytes()方法将字符串转换成字节序列,...