关于java中的编码问题
ok,今天搞了一天都在探索java字符的编码问题.十分头疼.最后终于得出几点:
1.网上有很多博客说判断一个String的编码的方法是通过如下代码;但其实这个代码完全是错的,用一种编码decode后,再encode,最后的结果是完全一样的.所以下面这个代码,不管用什么编码方式,结果都是true.
- String encode = "GB2312";
- try {
- if (str.equals(new String(str.getBytes(encode), encode))) {
- String s = encode;
- return s;
- }
- } catch (Exception exception) {
- }
- encode = "ISO-8859-1";
- try {
- if (str.equals(new String(str.getBytes(encode), encode))) {
- String s1 = encode;
- return s1;
- }
- } catch (Exception exception1) {
- }
2.接下来我要说一下我通过实验的出来的结论:java String中的编码方式其实是unicode编码,也就是utf-16编码.当然看到网上很多说法说unicode编码和utf-16编码不一样,但是通过在java中的测试,utf-16编码就是unicode编码,测试代码如下;
System.out.println(StandardCharsets.UTF_16.aliases()); //这个的输出结果是:[utf16, UnicodeBig, UTF_16, unicode]
3.我是怎么得到String中的编码都是unicode编码的:
首先我看了Charset.encode()和Charset.decode()这俩个方法,这俩个方法其实就是在将数据在特定的编码与unicode编码之间转换:将使用某种特定编码的byte流decode成
unicode编码的char[],那可以想象,这个转换其实是彻底的改变了byte流的数据,也就是直接按照编码之间的映射关系,对byte流直接做了修改.然后decode的原理相同,只是方向相反,将
unicode编码的数据直接修改,转换成了某种特定的编码所编码过后的数据.据此可以判断,java在识别char的时候,其实就是按照unicode的编码方式来识别byte流的.
再然后我粗略的看了一下String的构造函数还有getBytes函数的源码,当然源码真的十分复杂,看起来很费劲,所以我只是粗略的看了个大概,然后就可以想象其中的原理了.首先在
在构造String的时候,我们传进去了一个特定的Charset,然后看到在构造函数里调用了这个函数的encode方法,对byte[]进行的encode操作,当然,按照上面所说的,encode操作其实就是将某
种特定编码的byte数据转换成了unicode编码的数据.所以说,String中的编码其实全部都是unicode编码.
然后我看了一下getbytes函数的源码,同样,在这个函数里调用了charset的decode方法,将String中的char[]转换成了特定编码的byte[].那这也进一步证明了String中的数据
确实是由unicode编码编码的.
4.最后把这个原理用在实践中有什么用处呢.当我们从外部读入数据时,不管是读文件还是从网络流中读数据,当然如果直接按数据流一样读入后,读入的数据还保持着原来的编码方式,但如果我
们想把数据放入char[]中打印出来或进行字符处理的话,就会出错.所以要想进行字符操作,就要指定数据源的编码类型,然后将数据重新进行编码.
5.如何输出特定编码方式的数据.其实这个很简单,如果我们的处理后的数据的编码方式就是我们想要的编码方式的话,直接输出就好了.但如果不是的话,可以先把它转成unicode编码,然后再
转成我们想要的编码的byte[]流,然后直接输出去.在转换编码的时候,不建议直接使用Charset中的decode和encode,因为返回的buffer往往都比实际的数据要大,根据源码,我看到在返回buffer
的时候,并没有对buffer进行trim操作.建议使用String的getBytes方法.通过看源码,发现在源码中有trim的操作.长度是通过decode来返回的.decode的具体实现还没有
看完.
关于java中的编码问题的更多相关文章
- 理清Java中的编码解码转换
1.字符集及编码方式 概括:字符编码方式及大端小端 详细:彻底理解字符编码 可以通过Charset.availableCharsets()获取Java支持的字符集,以JDK8为例,得到其支持的字符集: ...
- java中的编码和编码格式问题
看来问的人和回答的人都不一定清楚什么是“编码和编码格式”,以及如何理解“java中字符串的编码”;首先明确几点: unicode是一种“编码”,所谓编码就是一个编号(数字)到字符的一种映射关系,就仅仅 ...
- java基础---->java中字符编码问题(一)
这里面对java中的字符编码做一个总结,毕竟在项目中会经常遇到这个问题.爱不爱都可以,我怎样都依你,连借口我都帮你寻. 文件的编码格式 一.关于中文的二进制字节问题 public static Str ...
- JAVA中的编码分析
在实际编程中可以不用关注JVM中使用的是什么编码,而只需要关注自己输出需要采用的编码,JVM会根据你设置的编码正确操作. 1.String采用的是什么编码? 很多厂家根据规范实现了JVM,JVM只说明 ...
- java中字符串编码转换
Java 正确的做字符串编码转换 字符串的内部表示? 字符串在java中统一用unicode表示( 即utf-16 LE) , 对于 String s = "你好哦!"; 如果源码 ...
- Java中字符编码和字符串所占字节数 .
首 先,java中的一个char是2个字节.java采用unicode,2个字节来表示一个字符,这点与C语言中不同,C语言中采用ASCII,在大多数 系统中,一个char通常占1个字节,但是在0~12 ...
- java 中的编码
1.1字节=8位,1024字节=1KB2.16进制0x12345678,其二进制为00010010 00110100 01010110 01111000共4字节3.字节序:两个或多个字节存放的先后顺序 ...
- 一文解开java中字符串编码的小秘密
目录 简介 Unicode的发展史 Unicode详解 UTF-8 UTF-16 UTF-32 Null-terminated string 和变种UTF-8 简介 在本文中你将了解到Unicode和 ...
- Java中的编码
package coreJava; import javax.swing.plaf.synth.SynthSpinnerUI; public class EncodeDemo { public sta ...
随机推荐
- SrpingCloud 之SrpingCloud config分布式配置中心搭建
1.搭建git环境 目的:持久化存储配置文件信息 采用码云 创建后 继续创建文件夹 用来区分不同的项目 下面就是git上存放配置文件了.环境的区分 dev sit pre prd 开发 ...
- HDU 5869 Different GCD Subarray Query(2016大连网络赛 B 树状数组+技巧)
还是想不到,真的觉得难,思路太巧妙 题意:给你一串数和一些区间,对于每个区间求出区间内每段连续值的不同gcd个数(该区间任一点可做起点,此点及之后的点都可做终点) 首先我们可以知道每次添加一个值时gc ...
- Socket bind failed: [730048] ?????????×???(Э?é/???????/???)????í??错误
启动项目的时候发现tomcat跑不起来.后台输出错误Socket bind failed: [730048] ?????????×???(Э?é/???????/???)????í?? 发现是ecli ...
- Spring的使用
Spring的组成 1. Core模块 该模块是Spring的核心容器,它实现了Ioc模式和Spring框架的基础功能. 2. Context模块 该模块继承BeanFactory类,并添加了事件处理 ...
- 仿联想商城laravel实战---6、自建配置文件和缓存(如何读取自己创建的配置文件的信息)
仿联想商城laravel实战---6.自建配置文件和缓存(如何读取自己创建的配置文件的信息) 一.总结 一句话总结: config()及相应的方法 1.前端插件选择好了,后端开发超级省力? 比如多图上 ...
- hibernate一级缓存和二级缓存的区别(转)
缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事 ...
- C#异步编程之浅谈Task
上一篇讲到了.Net4.5新增的async和await关键字,其实async和await算是一组标记,真正实现异步操作的是Task新开的任务线程. 什么是Task Task是.Net4.0新增用来处理 ...
- 【leetcode】Construct Binary Tree from Inorder and Postorder Traversal
Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that ...
- ACM学习历程—BZOJ 2115 Xor(dfs && 独立回路 && xor高斯消元)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2115 题目大意是求一条从1到n的路径,使得路径xor和最大. 可以发现想枚举1到n的所有路 ...
- 【ML】关于神经网络优化问题的随笔记
1. 为什么不去试着最大化正确分类的图像数量而使用二次代价函数? 在神经网络中,被正确分类的图像数量所关于权重和偏置的函数并不是一个平滑的函数.大多数情况下,对权重和偏执做出的微小变动完全不会影响被正 ...