Java如何获取文本文件的字符编码【UTF-8格式判断改进版】_获取txt文件编码,用程序获取,动态判断_小宇飞刀的博客-程序员秘密

技术标签: Java  Java教学  

一、认识字符编码:

1、Java中String的默认编码为UTF-8,可以使用以下语句获取:Charset.defaultCharset();

2、Windows操作系统下,文本文件的默认编码为ANSI,对中文Windows来说即为GBK。例如我们使用记事本程序新建一个文本文档,其默认字符编码即为ANSI。

3、Text文本文档有四种编码选项:ANSI、Unicode(含Unicode Big Endian和Unicode Little Endian)、UTF-8、UTF-16

4、因此我们读取txt文件可能有时候并不知道其编码格式,所以需要用程序动态判断获取txt文件编码。

  • ANSI     :无格式定义,对中文操作系统为GBK或GB2312
  • UTF-8   :前三个字节为:0xE59B9E(UTF-8)、0xEFBBBF(UTF-8含BOM)
  • UTF-16 :前两字节为:0xFEFF
  • Unicode:前两个字节为:0xFFFE

例如,Unicode文档以0xFFFE开头,用程序取出前几个字节并进行判断即可。

5、Java编码与Text文本编码对应关系:

Java中的编码字符串 Text编码  字节标志
GBK

ANSI

无格式定义
UTF-8

UTF-8包含两种规格:

UTF-8

UTF-8-BOM

需判断前三个字节:

前三个字节为:0xE59B9E

前三个字节为:0xEFBBBF

UTF-16 UTF-16 前两个字节为:0xFEFF
UNICODE

Unicode包含两种规格:

1、UCS2 Little Endian

2、UCS2 Big Endian

前两个字节为:0xFFFE

Java读取Text文件,如果编码格式不匹配,就会出现乱码现象。所以读取文本文件的时候需要设置正确字符编码。Text文档编码格式都是写在文件头的,在程序中需要先解析文件的编码格式,获得编码格式后,再以此格式读取文件就不会产生乱码了。

二、举个例子:

有一个文本文件:test.txt

  

测试代码: 

/**
 * 文件名:CharsetCodeTest.java
 * 功能描述:文件字符编码测试
 */

import java.io.*;

public class CharsetCodeTest {
    public static void main(String[] args) throws Exception {
        String filePath = "test.txt";
        String content = readTxt(filePath);
        System.out.println(content);
    }


public static String readTxt(String path) {
        StringBuilder content = new StringBuilder("");
        try {
            String fileCharsetName = getFileCharsetName(path);
            System.out.println("文件的编码格式为:"+fileCharsetName);

            InputStream is = new FileInputStream(path);
            InputStreamReader isr = new InputStreamReader(is, fileCharsetName);
            BufferedReader br = new BufferedReader(isr);

            String str = "";
            boolean isFirst = true;
            while (null != (str = br.readLine())) {
                if (!isFirst)
                    content.append(System.lineSeparator());
                    //System.getProperty("line.separator");
                else
                    isFirst = false;
                content.append(str);
            }
            br.close();
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("读取文件:" + path + "失败!");
        }
        return content.toString();
    }


    public static String getFileCharsetName(String fileName) throws IOException {
        InputStream inputStream = new FileInputStream(fileName);
        byte[] head = new byte[3];
        inputStream.read(head);

        String charsetName = "GBK";//或GB2312,即ANSI
        if (head[0] == -1 && head[1] == -2 ) //0xFFFE
            charsetName = "UTF-16";
        else if (head[0] == -2 && head[1] == -1 ) //0xFEFF
            charsetName = "Unicode";//包含两种编码格式:UCS2-Big-Endian和UCS2-Little-Endian
        else if(head[0]==-27 && head[1]==-101 && head[2] ==-98)
            charsetName = "UTF-8"; //UTF-8(不含BOM)
        else if(head[0]==-17 && head[1]==-69 && head[2] ==-65)
            charsetName = "UTF-8"; //UTF-8-BOM

        inputStream.close();

        //System.out.println(code);
        return charsetName;
    }
}

运行结果:

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xieyunc/article/details/103647862

智能推荐

最少硬币问题(c语言实现)_c语言编写币种问题_ccql的博客-程序员秘密

1.1题目算法实现题3-2 最少硬币问题★问题描述:设有n种不同面值的硬币,各硬币的面值存于数组T[1:n]中,现要用这些面值的硬币来找钱。可以使用的各种面值的硬币个数存于数组 Coins[l:n]中。对任意钱数0≤m≤20 001,设计一个用最少硬币找钱m的方法。★算法设计:对于给定的1≤n≤10,硬币面值数组T和可以使用的各种面值的硬币个数数组 Coins,以及钱数m,0≤m≤20 0...

简单web安全框架_zhongweijian的博客-程序员秘密

web安全框架,主要用servlet filter方式覆盖httpServletRequest和HttpServletResponse方式增加一些输入输出的过滤,github地址:https://github.com/zhwj184/webSecurity主要实现的安全包括:XSS过滤(获取用户输入参数和参数值进行XSS过滤,对Header和cookie value值进行X

consul:connect_weixin_30314793的博客-程序员秘密

官方文档:https://www.consul.io/docs/connect/index.html#getting-started-with-connectconsul connect的功能类似与envoy,作为一个sidecar,用于实现service mesh,按我的理解,所谓的service mesh其实就是通过服务注册和服务发现,以及sidecar,屏蔽调用服务的ip和端口...

金庸武侠作品_weixin_30258027的博客-程序员秘密

中国进搏会(七古)世界经济大发展, 治理方式大变革。国际秩序大调整,贸易关系大波折。抵制单边化逆浪,维护多边化规则。高举全球化旗帜,合奏现代化凯歌。2018、11、6 星期二金庸武侠作品(七古)直刀倚天屠龙记,弯弓射雕英雄传。神雕侠侣鹿鼎记,天龙八部碧血剑。杨过过与小龙女,三恋书剑恩仇传。笑傲江湖侠客行,雪山飞狐越女剑。东成西就连城诀,东邪西毒飞狐传。东方不败...

el-element的el-table的表头更改颜色_el-table表头颜色_靓靓的圆子的博客-程序员秘密

<el-table :data="moduleData2" tooltip-effect="dark" :header-cell-style="{background:'#ECF1FE'}"></el-table>api里有个header-cell-style,表头单元格的 style 的回调方法,也可以使用一个固定的 Object 为所有表头单元格设置一样的 Style。就可以改变表头的颜色了...

eclipse修改maven仓库的位置_本本的香菜的博客-程序员秘密

1.先移动你的maven仓库位置,就是把c盘下的.m2文件夹复制一份移动到你想移动的位置原位置:C:Users恒信科技.m2 要移动的位置:E:.m2 epository2.修改在maven的setting.xml文件找到并在后面加 <localRepository>E:.m2 epository</localRepository><settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xml

随便推点

Ubuntu解决系统图标变大以及分辨率降低问题(ubuntu18.04)_ubuntu系统图标很大_苏三福的博客-程序员秘密

星期一来上班一打开电脑发现Ubuntu系统显示变形了,之前就遇到过这个问题但是一直没有解决好。今天解决了顺便记录下,也方便分享给大家:开机引导文件: /etc/default/grub1/修改开机引导文件:sudo gedit /etc/default/grub2/找到文件中的GRUB_GFXMODE,并将其改为GRUB_GFXMODE=1920x1080(你想要的分辨率),并去掉GRUB_...

Harbor 企业级docker镜像私服_覃Ryong的博客-程序员秘密

文章目录Harbor 企业级docker镜像私服一、介绍二、安装环境准备三、安装 Harbor1、下载离线安装包并解压2、安装资源及环境准备3、安装三、使用1、登录 Harbor2、向 Harbor 推送镜像(1)制作镜像(2)推送镜像Harbor 企业级docker镜像私服一、介绍​ Harbor是由VMware公司开源的企业级的Docker Registry管理项目,它包括权限管理(R...

卷积神经网络初学者指南_龙骨的博客-程序员秘密

Part 1:图像识别任务介绍卷积神经网络,听起来像是计算机科学、生物学和数学的诡异组合,但它们已经成为计算机视觉领域中最具影响力的革新的一部分。神经网络在 2012 年崭露头角,Alex Krizhevsky 凭借它们赢得了那一年的 ImageNet 挑战赛(大体上相当于计算机视觉的年度奥林匹克),他把分类误差记录从 26% 降到了 15%,在当时震惊了世

《Spring实战 第4版》的阅读笔记 -----且行且珍惜_spring实战4该怎么看_心月梦天的博客-程序员秘密

(心月梦天)写在前面的:主要是为了做读书笔记共日后查阅吧,水平有限错漏之处在所难免,欢迎批评指教。无论如何,开发应该追求的是更优雅的代码、更高效的效率、更轻便的配置和更轻松的做事情。你觉得完美的代码随时间流逝会变得越发丑陋。Spring全家桶即将到达战场。

js去除数组中的重复元素_CloneWang的博客-程序员秘密

方法一:Array.prototype.method1 = function(){ var arr[]; //定义一个临时数组 for(var i = 0; i < this.length; i++){ //循环遍历当前数组 //判断当前数组下标为i的元素是否已经保存到临时数组 //如果已保...