java 文本编码_Java文件编码
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文件编码相关推荐
- java菱形乱码 编码_JAVA:编码与乱码问题
一.为什么要编码? 由于人类的语言太多,因而表示这些语言的符号太多,无法用计算机的一个基本的存储单元----byte来表示,因而必须要经过拆分或一些翻译工作,才能让计算机能理解. byte一个字节即8 ...
- 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中字体编码的问题仍难倒了不少程序员,网上虽然也有不少关于 ...
- Java的知识点28——文件编码、IO流的实例
文件编码 字符 -->字节 (编码 encode) 字节 --> 字符(解码 decode) 节点流 处理流 package cn.dym;import java ...
- linux java字符集编码_Java字符集编码
1. 概述 在 下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是"d6d0 cec4",Unicode编码为"4e2d 65 ...
- java http编码_java httprequest编码/解码
http://jiapumin.iteye.com/blog/1006144 在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组.这个表示在不通OS下,返回 ...
- java字符集编码_Java字符集编码
1.概述 在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是"d6d0 cec4",Unicode编码为"4e2d 6587& ...
- java %u解码_Java:编码与乱码问题
一.为什么要编码? 由于人类的语言太多,因而表示这些语言的符号太多,无法用计算机的一个基本的存储单元----byte来表示,因而必须要经过拆分或一些翻译工作,才能让计算机能理解. byte一个字节即8 ...
- jsp java乱码转换_Java Web 编码问题一:jsp的编码问题
首先我们来看一张由eclipse生成的jsp文件的头: 图1:JSP文件编码 如上图所示jsp中的三个编码, ①代表的是服务器响应客户端请求的编码方式.服务器会用它来设置http响应头的content ...
- ansi编码_Java 字符编码
点击上方蓝字关注我们! 作者介绍 王云静,Java 开发工程师,2018 年 7 月加入去哪儿网,目前在目的地 - 呼叫中心.曾获得过 ACM 亚洲区域赛铜牌. ----- 基本概念 字符集 字符(C ...
- python3默认的字符编码和文件编码_Python的字符编码之三个问题
看过很多关于Python字符编码的博客,或深或浅,总感觉有点云里雾里,今天这里我尝试用我的方式也来凑个热闹. 首先,我们要弄清楚几个问题,这个对我们后面的理解非常重要. 字节与字符 Python源代码 ...
最新文章
- [Android学习笔记]理解焦点处理原理的相关记录
- JavaScript 获取服务器端checkBoxlist控件选中的值
- 硬件编程:77条STM32知识汇总
- Android Studio开发基础之启动Service,并通过从Activity向Service传递数据
- Linux系统检查查看桌面环境
- Onvif开发之Linux下gsoap的使用及移植
- 在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如RXXLRXRXL)中进行移动操作。一次移动操作指用一个LX替换一个XL,或者用一个XR替换一个RX。现给定起始...
- 什么是立即执行函数,有什么作用?
- 【Java数据结构】链式存储的二叉树
- IDEA 如何打jar包
- 如何让 Mac 加入网络帐户服务器?
- linux-CentOS7.6操作系统安装手册
- 无水印好用Flash头像编辑器组件
- JQuery插件:JQuery.Slidebox.JS
- 所有大学都教Java,培训班也输出了大量Java程序员,为什么社会上的Java程序员还没有饱和?
- AI 人工智能 探索 (九)
- win10ftp服务器上传文件时提示报错,win10 ftp服务器 无权限问题
- centos8更换国内源(阿里源)
- bootstrap-table 父子表 联动表 完整例子
- 群晖中安装PHPEMS 6.1在线模拟考试系统
热门文章
- 如何在Linux下编译Openwrt的ipk(编译Dogcom为例)
- Eclipse 中设置编辑器字体,包括 Java 编辑器,XML 编辑器和 Property 编辑器的字体都可以设置
- 飞鸽传书【经典版】(飞鸽传书2011)
- 计算机会考excel操作,信息技术会考EXCEL操作题.doc
- 物联网设备接入流程与平台架构
- win10关闭windows聚焦_win10 系统中的windows聚焦是什么意思 - 卡饭网
- vue 点击文字input_Vue实现点击按钮复制文本内容
- 涉密计算机检查情况 月检查表,关于2017年下半年保密检查的通知
- Sobel边缘检测算子数学原理再学习
- 个人名片+微信名片二维码 VUE