`
hongjn
  • 浏览: 55263 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

java 字符编码深入理解

阅读更多

 

相关概念:
1.Java中的字符串String由字符(char)序列表示,他实现了“字符序列”接口CharSequence。
在Java中,char类型由UTF-16描述一个代码单元。
(引用Core Java第八版:In Java, the char type describes a code unit in the UTF-16 encoding.)
这里所说的Java中,说的是编译完的class文件,并非Java源代码文件,事实上,Java源代码文件的字符集格式是由我们自己定义的,比如GBK,UTF-8等。
2.在Java中字符类型由“代码单元”表示(code unit),其中又涉及到“代码点”的概念,即对应unicode中的字符编码。
我们在用String的length()方法得到字符串长度的时候,其实得到的时候代码单元的个数,如果字符串当中包含“辅助字符”,得到的length长度可能就不是我们想象中的那样了,这点很重要。要得到真正的长度,其实应该用codePointCount()方法!
3.bmp维基百科中是这么描述BMP的:基本多語言平面內定義的符號(Basic Multilingual Plane, BMP)
4.同时还有"辅助平面"的概念
:关于bmp和辅助平面,这些概念比较抽象,也是看了好几遍的维基百科才明白的。
我的最简单理解是:编码在0-65535之间的字符属于bmp,大于65535的就属于辅助平面
5.bom(byte order mark),为了区分大小尾序,UTF-16LE以FF FE代表,UTF-16BE以FE FF代表(其中U+FEFF字符在UNICODE中代表的意義是ZERO WIDTH NO-BREAK SPACE,顧名思義,它是個沒有寬度也沒有断字的空白)

关于UTF-16编码(没有包含涉及到的UTF-16LE和UTF-16BE,即大小尾序)
1)在基本多语言平面内(bmp)的字符由一个代码单元组成,也就是说包含俩字节
2)在辅助平面内的字符,由俩代码单元组成,也就是包含四个字节(这些字符很少用到)

另外:65535对应的十六进制数字为0xFFFF,他起到分界线的作用,很重要的数字。
由于UNICODE编码范围最大为0x10FFFF,因此得到辅助平面的范围:0x10000~0x10FFFF
3)UTF-16编码的算法
a.编码在0到65535之间,也就是属于bmp的字符,直接才用本身的俩字节来表示
b.编码大于65535的,也就是辅助字符范围内的算法比较麻烦一点。
先有两个重要的数字0xD800(二进制:1101100000000000)和0xDC00(二进制:1101110000000000)
取字符的编码前十位和0xD800进行or位运算,后十位和0xDC00进行or位运算,得到的32位的四个字节就是该字符的编码了。

参考:





1
1
分享到:
评论

相关推荐

    tomcat字符编码总结

    tomcat字符编码总结 深入了解!从网上搜集了很多,自己整理的

    125集专攻JAVA基础 JAVA零基础入门学习视频教程 动力节点JAVA视频教程.txt

    北京动力节点-Java编程零基础教程-049-Java基本语法-通过ASCII再理解字符编码.avi 北京动力节点-Java编程零基础教程-050-Java基本语法-ASCII.avi 北京动力节点-Java编程零基础教程-051-Java基本语法-ISO8859-1....

    Java工程师必学系列课程之5--《字符串及正则表达式》视频课程

    并完成案例前导课程:《Java工程师必学系列课程》前4部课程内容:本课程是《Java工程师必学系列课程》的第5部分,主要讲解Java语言中字符串相关知识、字符编码常识和正则表达式的使用。本课程涉及的主要内容可以分为...

    Java开发详解.zip

    031216_【第12章:JAVA IO】_字符编码笔记.pdf 031217_【第12章:JAVA IO】_对象序列化笔记.pdf 031218_〖第12章:JAVA IO〗_实例操作—单人信息管理程序笔记.pdf 031219_〖第12章:JAVA IO〗_实例操作:投票程序...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    7.11 小结:多方位理解Java方法 191 7.12 习题 192 第8章 Java中的包(Package)命名习惯和注释 193 教学视频:43分钟 8.1 Java中的包(Package) 193 8.1.1 Java中的包 193 8.1.2 在Eclipse中使用包 194 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    7.11 小结:多方位理解Java方法 191 7.12 习题 192 第8章 Java中的包(Package)命名习惯和注释 193 教学视频:43分钟 8.1 Java中的包(Package) 193 8.1.1 Java中的包 193 8.1.2 在Eclipse中使用包 194 ...

    疯狂JAVA讲义

    第1章 Java概述 1 1.1 Java语言的发展简史 2 1.2 Java的竞争对手及各自优势 4 1.2.1 C#简介和优势 4 1.2.2 Ruby简介和优势 4 1.2.3 Python的简介和优势 5 1.3 Java程序运行机制 5 1.3.1 高级语言的运行机制 6...

    Java面试宝典(传说中的葵花宝典).doc

    char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储...

    java web开发技术大全

    4.7.1 Java的编码原理 4.7.2 实例:解决输出中文乱码问题 4.7.3 实例:解决服务端程序读取中文请求消息的乱码问题 4.7.4 实例:用AJAX技术发送和接收中文信息 4.7.5 实例:在请求消息头和响应消息头...

    精通并发与 netty 视频教程(2018)视频教程

    39_NIO中Scattering与Gathering深度解析 40_Selector源码深入分析 41_NIO网络访问模式分析 42_NIO网络编程实例剖析 43_NIO网络编程深度解析 44_NIO网络客户端编写详解 45_深入探索Java字符集编解码 46_字符集编解码...

    java web技术开发大全(最全最新)

    4.7.1 Java的编码原理 4.7.2 实例:解决输出中文乱码问题 4.7.3 实例:解决服务端程序读取中文请求消息的乱码问题 4.7.4 实例:用AJAX技术发送和接收中文信息 4.7.5 实例:在请求消息头和响应消息头中转输...

    C++编程思想(Thinking in C++)完美版pdf

    第3章 深入理解字符串 第4章 输入输出流 第5章 深入理解模板 第6章 通用算法 第7章 通用容器 第三部分 专题 第8章 运行时类型识别 第9章 多重继承 第10章 设计模式 第11章 并发 附录 附录A 推荐读物 附录B 其他 索引...

    Java SM3&SM4; 脱坑版

    较深入的了解。因此我们部门小美女特意制作了脱坑版,这个版本统一并简化了调用 接口,使接口简单易于使用。 主要包括的坑: ★ 字符集不确定,在内部来回转换。 ★ 编码问题 byte/hex/base64 不明。(甚至出现...

    Java语言课程设计任务书.doc

    目的: 1)复习、巩固Java语言的基础知识,进一步加深对Java语言的理解和掌握; 2)课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识 和实际有机的结合起来,锻炼学生的分析解决实际问题的...

    精通并发与netty视频教程(2018)视频教程

    45_深入探索Java字符集编解码 46_字符集编解码全方位解析 47_Netty服务器与客户端编码模式回顾及源码分析准备 48_Netty与NIO系统总结及NIO与Netty之间的关联关系分析 49_零拷贝深入剖析及用户空间与内核空间切换方式...

    Visual C++ 2005入门经典--源代码及课后练习答案

    第8章 深入理解类 369 8.1 类的析构函数 369 8.1.1 析构函数的概念 369 8.1.2 默认的析构函数 370 8.1.3 析构函数与动态内存分配 372 8.2 实现复制构造函数 375 8.3 在变量之间共享内存 377 8.3.1 ...

    精通并发与netty 无加密视频

    第45讲:深入探索Java字符集编解码 第46讲:字符集编解码全方位解析 第47讲:Netty服务器与客户端编码模式回顾及源码分析准备 第48讲:Netty与NIO系统总结及NIO与Netty之间的关联关系分析 第49讲:零拷贝深入...

    leetcodejava常用-language-cheatsheets:为希望学习其他语言的JavaScript程序员准备的备忘单集合

    repo并非旨在深入了解这些语言中的任何一种。 如何使用这个 repo 学习这个 repo 中的材料的最有效和最有效的方法是开始用你的新语言编码,然后每次你遇到不知道怎么做的事情时都使用它作为参考。 我们试图通过按数据...

    Grails 中文参考手册

    11.2 字符串的编码和解码 11.3 身份验证 11.4 关于安全的插件 11.4.1 Acegi 11.4.2 JSecurity 12 插件 12.1 创建和安装插件 12.2 理解插件的结构 12.3 提供基础的工件 12.4 评估规约 12.5 参与构建事件 12.6 参与...

Global site tag (gtag.js) - Google Analytics