Java文件编码

处理文本文件时,经常会碰上乱码。那么,乱码是怎么产生的呢?

文件以一定的编码规则存储在计算机中,却又以字符的形式显示在屏幕上。为了能有效节省存储空间,又提高转化为字符的效率,人们研究出多种编码格式。例如,utf-16,utf-8,gbk,gb18030..

大家知道,所有文件在计算机中都以二进制的形式存在。在java中,我们自然可以选择使用字节流来处理文件,更常用的还是字符流。

编码原理

java的nio中,Reader是所有输入字符流的父类,InputStream是所有输入字节流的父类。

字符 -> 编码 -> 字节

字节 -> 解码 -> 字符

当我们使用utf-8进行编码时,就必须使用utf-8解码。

picture1

当使用GBK编码,iso-8859-1解码时,会出现以下情况:

picture2

编码解码的不可逆性

byte ge[] = { (byte) 0xb8, (byte) 0xf6 };

若使用

String s = new String(ge, "gbk");

打印出s,为个

再按几种编码格式对 s 进行编码:

//则取出的字节值为:-28,-72,-86。

//‘个’的utf8编码

s.getBytes("utf8")

//得到0xb8,0xf6。‘个’的gbk编码

s.getBytes("gbk")

若使用

String s = new String(ge, "utf8");

此时s已经是乱码。

//得到-17,-65,-67,-17,-65,-67

s.getBytes("utf8")

此时s的内容已经完全乱掉了,所以再用

s.getBytes("gbk");

得到的数据也是乱的,无法逆向出真正的内容来。

两种正确解析方式

采用开源库:CpDetector进行自动检测文本编码

使用字符流

Charset charset = codepageDetectorProxy.detectCodepage(inputStream,100);

bufferedReader = new BufferedReader(new InputStreamReader(inputStream,charset.name()));

while((line = bufferedReader.readLine()) != null) {

contentTxt += line;

}

使用字节流

BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);

Charset charset = codepageDetectorProxy.detectCodepage(inputStream,100);

bytes = new byte[bufferedInputStream.available()];

bufferedInputStream.read(bytes);

contentTxt += Charset.forName(charset.name()).decode(ByteBuffer.wrap(bytes)).toString();

结尾

参考链接:

time:30min

java 文本编码_Java文件编码相关推荐

  1. java菱形乱码 编码_JAVA:编码与乱码问题

    一.为什么要编码? 由于人类的语言太多,因而表示这些语言的符号太多,无法用计算机的一个基本的存储单元----byte来表示,因而必须要经过拆分或一些翻译工作,才能让计算机能理解. byte一个字节即8 ...

  2. java sql编码_java+sql 编码 UTF-8、ISO-8859-1、GBK

    java 编码 UTF-8.ISO-8859-1.GBK Java支持UTF-8.ISO-8859-1.GBK等各种字体编码,可笔者发现Java中字体编码的问题仍难倒了不少程序员,网上虽然也有不少关于 ...

  3. Java的知识点28——文件编码、IO流的实例

    文件编码  字符 -->字节  (编码 encode)           字节 --> 字符(解码 decode) 节点流  处理流 package cn.dym;import java ...

  4. linux java字符集编码_Java字符集编码

    1.  概述 在 下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是"d6d0 cec4",Unicode编码为"4e2d 65 ...

  5. java http编码_java httprequest编码/解码

    http://jiapumin.iteye.com/blog/1006144 在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组.这个表示在不通OS下,返回 ...

  6. java字符集编码_Java字符集编码

    1.概述 在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是"d6d0 cec4",Unicode编码为"4e2d 6587& ...

  7. java %u解码_Java:编码与乱码问题

    一.为什么要编码? 由于人类的语言太多,因而表示这些语言的符号太多,无法用计算机的一个基本的存储单元----byte来表示,因而必须要经过拆分或一些翻译工作,才能让计算机能理解. byte一个字节即8 ...

  8. jsp java乱码转换_Java Web 编码问题一:jsp的编码问题

    首先我们来看一张由eclipse生成的jsp文件的头: 图1:JSP文件编码 如上图所示jsp中的三个编码, ①代表的是服务器响应客户端请求的编码方式.服务器会用它来设置http响应头的content ...

  9. ansi编码_Java 字符编码

    点击上方蓝字关注我们! 作者介绍 王云静,Java 开发工程师,2018 年 7 月加入去哪儿网,目前在目的地 - 呼叫中心.曾获得过 ACM 亚洲区域赛铜牌. ----- 基本概念 字符集 字符(C ...

  10. python3默认的字符编码和文件编码_Python的字符编码之三个问题

    看过很多关于Python字符编码的博客,或深或浅,总感觉有点云里雾里,今天这里我尝试用我的方式也来凑个热闹. 首先,我们要弄清楚几个问题,这个对我们后面的理解非常重要. 字节与字符 Python源代码 ...

最新文章

  1. [Android学习笔记]理解焦点处理原理的相关记录
  2. JavaScript 获取服务器端checkBoxlist控件选中的值
  3. 硬件编程:77条STM32知识汇总
  4. Android Studio开发基础之启动Service,并通过从Activity向Service传递数据
  5. Linux系统检查查看桌面环境
  6. Onvif开发之Linux下gsoap的使用及移植
  7. 在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如RXXLRXRXL)中进行移动操作。一次移动操作指用一个LX替换一个XL,或者用一个XR替换一个RX。现给定起始...
  8. 什么是立即执行函数,有什么作用?
  9. 【Java数据结构】链式存储的二叉树
  10. IDEA 如何打jar包
  11. 如何让 Mac 加入网络帐户服务器?
  12. linux-CentOS7.6操作系统安装手册
  13. 无水印好用Flash头像编辑器组件
  14. JQuery插件:JQuery.Slidebox.JS
  15. 所有大学都教Java,培训班也输出了大量Java程序员,为什么社会上的Java程序员还没有饱和?
  16. AI 人工智能 探索 (九)
  17. win10ftp服务器上传文件时提示报错,win10 ftp服务器 无权限问题
  18. centos8更换国内源(阿里源)
  19. bootstrap-table 父子表 联动表 完整例子
  20. 群晖中安装PHPEMS 6.1在线模拟考试系统

热门文章

  1. 如何在Linux下编译Openwrt的ipk(编译Dogcom为例)
  2. Eclipse 中设置编辑器字体,包括 Java 编辑器,XML 编辑器和 Property 编辑器的字体都可以设置
  3. 飞鸽传书【经典版】(飞鸽传书2011)
  4. 计算机会考excel操作,信息技术会考EXCEL操作题.doc
  5. 物联网设备接入流程与平台架构
  6. win10关闭windows聚焦_win10 系统中的windows聚焦是什么意思 - 卡饭网
  7. vue 点击文字input_Vue实现点击按钮复制文本内容
  8. 涉密计算机检查情况 月检查表,关于2017年下半年保密检查的通知
  9. Sobel边缘检测算子数学原理再学习
  10. 个人名片+微信名片二维码 VUE