知识大全 Java中的中文编码问题
Posted 字节
篇首语:锲而舍之,朽木不折;锲而不舍,金石可镂。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java中的中文编码问题相关的知识,希望对你有一定的参考价值。
Java中的中文编码问题 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
( ) 为什么要编码 由于人类的语言有太多 因而表示这些语言的符号太多 无法用计算机中一个基本的存储单元byte 来表示 因而必须要经过拆分或一些翻译工作 才能让计算机能理解 所以总的来说 编码的原因可以总结为 计算机中存储信息的最小单元是一个字节即 个 bit 所以能表示的字符范围是 ~ 个 人类要表示的符号太多 无法用一个字节来完全表示 要解决这个矛盾必须需要一个新的数据结构 char 从 char 到 byte 必须编码 ( ) 编码方式 ASCII 码 ASCII 码 总共有 个 用一个字节的低 位表示 ~ 是控制字符如换行回车删除等 ~ 是打印字符 可以通过键盘输入并且能够显示出来 ISO 个字符显然是不够用的 于是 ISO 组织在 ASCII 码基础上又制定了一些列标准用来扩展 ASCII 编码 它们是 ISO ~ISO 其中 ISO 涵盖了大多数西欧语言字符 所有应用的最广泛 ISO 仍然是单字节编码 它总共能表示 个字符 GB 它的全称是《信息交换用汉字编码字符集 基本集》 它是双字节编码 总的编码范围是 A F 其中从 A A 是符号区 总共包含 个符号 从 B F 是汉字区 包含 个汉字 GBK 全称叫《汉字内码扩展规范》 是国家技术监督局为 windows 所制定的新的汉字内码规范 它的出现是为了扩展 GB 加入更多的汉字 它的编码范围是 ~FEFE(去掉 XX F)总共有 个码位 它能表示 个汉字 它的编码是和 GB 兼容的 也就是说用 GB 编码的汉字可以用 GBK 来解码 并且不会有乱码 UTF 说到 UTF 必须要提到 Unicode(Universal Code 统一码) ISO 试图想创建一个全新的超语言字典 世界上所有的语言都可以通过这本字典来相互翻译 UTF 具体定义了 Unicode 字符在计算机中存取方法 UTF 用两个字节来表示 Unicode 转化格式 这个是定长的表示方法 不论什么字符都可以用两个字节表示 两个字节是 个 bit 所以叫 UTF UTF 表示字符非常方便 每两个字节表示一个字符 这个在字符串操作时就大大简化了操作 这也是 Java 以 UTF 作为内存的字符存储格式的一个很重要的原因 UTF UTF 统一采用两个字节表示一个字符 虽然在表示上非常简单方便 但是也有其缺点 有很大一部分字符用一个字节就可以表示的现在要两个字节表示 存储空间放大了一倍 在现在的网络带宽还非常有限的今天 这样会增大网络传输的流量 而且也没必要 而 UTF 采用了一种变长技术 每个编码区域有不同的字码长度 不同类型的字符可以是由 ~ 个字节组成 UTF 有以下编码规则 如果一个字节 最高位(第 位)为 表示这是一个 ASCII 字符( F) 可见 所有 ASCII 编码已经是 UTF 了 如果一个字节 以 开头 连续的 的个数暗示这个字符的字节数 例如 xxxxx 代表它是双字节 UTF 字符的首字节 如果一个字节 以 开始 表示它不是首字节 需要向前查找才能得到当前字符的首字节 [java] view plaincopy
- /** * byte Array toHex * @param b * @return */ public static String toHex(byte[] b) String result = ; for (int i = ; i < b length; i++) String hex = Integer toHexString(b[i] & xFF); if (hex length() == ) //高四位置为 hex = + hex; result = result + +hex toUpperCase(); return result; /** * char to byte array * @param c * @return */ public static byte[] charToByte(char c) byte[] b = new byte[ ]; b[ ] = (byte) ((c & xFF ) >> ); b[ ] = (byte) (c & xFF); return b; /** * char array toHex * @param c */ public static void charToHex(char[] c) for(char cc:c) byte[] b =charToByte(cc); System out print(toHex(b)); public static void main(String[] args) String name = I am 君山 ; charToHex(name toCharArray()); System out println(); try byte[] iso = name getBytes( ISO ); System out println(toHex(iso )); byte[] gb = name getBytes( GB ); System out println(toHex(gb )); byte[] gbk = name getBytes( GBK ); System out println(toHex(gbk)); byte[] utf = name getBytes( UTF ); System out println(toHex(utf )); byte[] utf = name getBytes( UTF ); System out println(toHex(utf )); catch (UnsupportedEncodingException e) e printStackTrace();
个 char 字符经过 ISO 编码转变成 个 byte 数组 中文 君山 被转化成值是 f 的 byte f 也就是 ? 字符 所以经常会出现中文变成 ? 很可能就是错误的使用了 ISO 这个编码导致的 字符串 I am 君山 用 GB 编码 下面是编码结果
GB 编码 GB 字符集有一个 char 到 byte 的码表 不同的字符编码就是查这个码表找到与每个字符的对应的字节 然后拼装成 byte 数组 如果查到的码位值大于 oxff 则是双字节 否则是单字节 双字节高 位作为第一个字节 低 位作为第二个字节 从结果可以看出前 个字符经过编码后仍然是 个字节 而汉字被编码成双字节 在第一节中介绍到 GB 只支持 个汉字 所以并不是所有汉字都能够用 GB 编码 字符串 I am 君山 用 GBK 编码 下面是编码结果
你可能已经发现上图与 GB 编码的结果是一样的 没错 GBK 与 GB 编码结果是一样的 由此可以得出 GBK 编码是兼容 GB 编码的 它们的编码算法也是一样的 不同的是它们的码表长度不一样 GBK 包含的汉字字符更多 所以只要是经过 GB 编码的汉字都可以用 GBK 进行解码 反过来则不然 字符串 I am 君山 用 UTF 编码 下面是编码结果
用 UTF 编码将 char 数组放大了一倍 单字节范围内的字符 在高位补 变成两个字节 中文字符也变成两个字节 从 UTF 编码规则来看 仅仅将字符的高位和地位进行拆分变成两个字节 特点是编码效率非常高 规则很简单 字符串 I am 君山 用 UTF 编码 下面是编码结果
cha138/Article/program/Java/hx/201311/26063相关参考
PHP程序开发中的中文编码问题[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 数据库中的字
PHP程序开发中的中文编码问题[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! PHP程序设
PHP程序开发中的中文编码问题[4] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 同样也留有一
Java本身就支持多国语言编码不需要写任何程序可以很简单的实现秘诀就是两点 所有HTML/JSP页面全部采用UTF编码 客户端浏览器完全支持UTF编码 步骤 首先把所有的HTM
Java属性文件编码问题 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Property文件中使
Java多语言编码问题解析(1) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Java编译器在
Java多语言编码问题解析(2) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 这里是一个具体的
Javaweb解决常见编码出现的问题 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n
JSP中文编码问题解决方法详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 最基本的乱码问
JSP中的汉字编码问题 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 网上就JSP/Servle