`
Zale_zhy
  • 浏览: 7593 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
社区版块
存档分类
最新评论

Java:判断文件的编码,并转换为ANSI

    博客分类:
  • J2SE
阅读更多
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;
}

}

分享到:
评论

相关推荐

    java程序判断文件编码的类型

    - **编码转换**:当读取文件后,如果需要将不同编码的文本转换为统一的编码(如UTF-8),可以使用Java中的`InputStreamReader`或`OutputStreamWriter`类进行编码转换。 - **异常处理**:在处理文件时可能会遇到各种...

    Android手机端转换Ansi字符串,手机怎么转换为ansi编码,Delphi源码.rar

    - 使用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" 还是挺简单的吧~~...

    php php3 aspx asp html sql java文件编码批量转换软件

    - 将文件内容读入内存并转换为新的目标编码。 - 写回转换后的内容到原文件或新文件。 这样的工具对多语种网站的开发者和维护者尤其有用,因为它们可以快速地处理大量文件,节省手动修改的时间和减少出错的可能性。...

    Java乱码问题

    3. **对于已存在的Java文件**,如果之前保存时使用的是GBK编码格式,并且在编译时出现了乱码问题,可以通过转换文件的编码格式来解决。 - 将文件另存为ANSI格式。尽管这种方法看起来简单粗暴,但它实际上是一种有效...

    Android手机端转换Ansi字符串,手机怎么转换为ansi编码,Delphi源码.zip

    总结一下,将Android手机端的Unicode字符串转换为Ansi编码,需要理解各种编码的特性,掌握Delphi中的编码转换方法,以及熟悉Android的JNI接口。通过上述步骤,可以实现跨平台的字符编码兼容,确保数据的正确传输和...

    Java读取TXT文本文件乱码解决方案.doc

    因此,需要将文件的编码格式转换为 UTF-16,以解决乱码的问题。 解决方案是使用 InputStreamReader 对象来读取文件,并将编码格式设置为 UTF-16。这样,乱码的问题就得到了解决。 在文章中,还提供了一些关于 TXT ...

    文件编码格式批量转换工具.rar

    3. **转换过程**:使用对应的解码器将文件内容从原编码转换为Unicode,然后用UTF-8编码器重新编码。 4. **保存结果**:将转换后的内容写入新文件,通常在原文件名基础上加上标识符,以保留原始文件。 压缩包子文件...

    utf-8 ansi 字符互转 工具

    然而,在处理旧的、仅支持ANSI编码的系统或文件时,可能需要进行编码转换。 总结来说,理解和掌握UTF-8与ANSI字符编码的差异,以及如何进行转换,对于解决跨平台、多语言环境下的文本处理问题至关重要。在日常工作...

    Transcoding_setup_v0.7.1 文件编码转换

    总是遇到文件编码不一致的情况,自己抽时间用java开发了一款编码转换小工具,已封装成exe,图形化操作界面,内置使用说明,欢迎下载使用。 支持批量转换 支持单个文件转换 支持gb2312、gbk(ansi)、gb18030、utf-8、...

    Java避免UTF-8的csv文件打开中文出现乱码的方法

    可以使用getBytes()方法将字符串转换为字节数组,并指定编码格式为UTF-16LE。例如: ```java String[] heads = {"日期", "产品", "订单数"}; String[][] rows = {{"20150228", "安卓", "23"}, {"20150301", "web", ...

    Java字符集和编码

    在探讨Java字符集和编码之前,我们先了解一下为什么在Java编程中需要关注字符集和编码。Java作为一种广泛应用的编程语言,其内部采用的是Unicode编码,这使得Java能够很好地支持全球化的应用开发。然而,在实际的...

    Ansi与Ucs2互转.rar

    在易语言环境下,可以使用“字符串转换”命令系列进行编码转换。例如,可以先使用“字符串到字节序列”将Ansi字符串转换为字节数组,然后使用“字节序列到字符串”配合指定的UCS-2编码进行转换。反之,从UCS-2到Ansi...

    JAVA 读取dbf文件

    Apache Commons项目中的DBF库提供了一套工具类,可以解析DBF文件并将其转换为Java对象。通过`DbfReader`类,可以打开DBF文件,获取字段信息,并迭代记录进行处理。 5. **代码示例**: 使用JDBF库读取DBF文件的...

    java编译 编码

    接下来,CPU将缓冲区的数据读入内存,并在这一过程中调用编码转换函数,将GBK编码的“眼泪”转换为Unicode编码(FFFE 3C77 EA6C)。随后,为了在屏幕上显示该字符,CPU再次调用编码转换函数,将内存中的Unicode编码...

    java读写excel包括utf8转码为可识别汉字gbk

    java读写excel包括utf8转码为可识别汉字gbk,jxl方式读取excel,生成一个新的excel

    python实现JAVA源代码从ANSI到UTF-8的批量转换方法

    在这个问题中,我们需要将大量的JAVA源代码文件从ANSI编码转换为UTF-8编码。ANSI编码是一种与系统区域设置相关的编码方式,通常在Windows系统中,ANSI对应于Windows默认的本地编码,如GBK或GB2312。而UTF-8是一种更...

    Java中编码总结.pdf

    由于提供的文件内容包含了技术性质的详细说明,所以本段落将根据提供的文档内容概述Java中的编码知识,同时纠正识别错误并补充遗漏,确保知识的连贯性和准确性。 首先,文档中提到了Java中与字符编码相关的基本概念...

    Java IO流 文件的编码实例代码

    Java IO流文件编码是Java语言中的一种文件编码方式,它可以将文件转换成不同的编码格式,以便在不同的平台和系统中使用。在Java中,文件编码可以使用不同的方式,包括使用getBytes()方法将字符串转换成字节序列,...

Global site tag (gtag.js) - Google Analytics