编程语言:java 编码方式:Unicode 问题: 通常状况下,在屏幕显示上一个汉字所占的大小是字符的两倍。若是直接使用length()方法,获取到的是code unit的数目。 例如,“123abc长城”.length() 计算是8。如何肯定字符串在屏幕上的长度大小? 分析: 咱们须要一种方法使得汉字的长度是普通字符的两倍。 为了得到10,须要从头扫描根据字符的Ascii来得到具体的长度。若是是标准的字符,Ascii的范围是0至255,若是是汉 字或其余全角字符,Ascii会大于255。所以,能够编写以下的方法来得到以字节为单位的字符串长度。 解决: public int getWordCount(String s) { int length = 0; for (int i = 0; i < s.length(); i++) { int ascii = Character.codePointAt(s, i); if (ascii >= 0 && ascii <= 255) length++; else length += 2; } return length; } 上面代码的基本原理是将字符串中全部的非标准字符(双字节字符)替换成两个标准字符(**,或其余的也能够)。 或者:
public int getWordCount(String s) { s = s.replaceAll("[^\\x00-\\xff]", "**"); int length = s.length(); return length; }
return String.getByte().length() ; return String.getByte("gbk").length() ;
详细请参考 http://www.cnblogs.com/God-/p/6006749.htmlhtml
几种编码格式。java
- ASCII 码
学过计算机的人都知道 ASCII 码,总共有 128 个,用一个字节的低 7 位表示,0~31 是控制字符如换行回车删除等;32~126 是打印字符,能够经过键盘输入而且可以显示出来。编程
- ISO-8859-1
128 个字符显然是不够用的,因而 ISO 组织在 ASCII 码基础上又制定了一些列标准用来扩展 ASCII 编码,它们是 ISO-8859-1~ISO-8859-15,其中 ISO-8859-1 涵盖了大多数西欧语言字符,全部应用的最普遍。ISO-8859-1 仍然是单字节编码,它总共能表示 256 个字符。windows
- GB2312
它的全称是《信息交换用汉字编码字符集 基本集》,它是双字节编码,总的编码范围是 A1-F7,其中从 A1-A9 是符号区,总共包含 682 个符号,从 B0-F7 是汉字区,包含 6763 个汉字。网络
- GBK
全称叫《汉字内码扩展规范》,是国家技术监督局为 windows95 所制定的新的汉字内码规范,它的出现是为了扩展 GB2312,加入更多的汉字,它的编码范围是 8140~FEFE(去掉 XX7F)总共有 23940 个码位,它能表示 21003 个汉字,它的编码是和 GB2312 兼容的,也就是说用 GB2312 编码的汉字能够用 GBK 来解码,而且不会有乱码。编程语言
- GB18030
全称是《信息交换用汉字编码字符集》,是我国的强制标准,它多是单字节、双字节或者四字节编码,它的编码与 GB2312 编码兼容,这个虽然是国家标准,可是实际应用系统中使用的并不普遍。编码
- UTF-16
说到 UTF 必需要提到 Unicode(Universal Code 统一码),ISO 试图想建立一个全新的超语言字典,世界上全部的语言均可以经过这本字典来相互翻译。可想而知这个字典是多么的复杂,关于 Unicode 的详细规范能够参考相应文档。Unicode 是 Java 和 XML 的基础,下面详细介绍 Unicode 在计算机中的存储形式。翻译
UTF-16 具体定义了 Unicode 字符在计算机中存取方法。UTF-16 用两个字节来表示 Unicode 转化格式,这个是定长的表示方法,不论什么字符均可以用两个字节表示,两个字节是 16 个 bit,因此叫 UTF-16。UTF-16 表示字符很是方便,每两个字节表示一个字符,这个在字符串操做时就大大简化了操做,这也是 Java 以 UTF-16 做为内存的字符存储格式的一个很重要的缘由。code
- UTF-8
UTF-16 统一采用两个字节表示一个字符,虽然在表示上很是简单方便,可是也有其缺点,有很大一部分字符用一个字节就能够表示的如今要两个字节表示,存储空间放大了一倍,在如今的网络带宽还很是有限的今天,这样会增大网络传输的流量,并且也不必。而 UTF-8 采用了一种变长技术,每一个编码区域有不一样的字码长度。不一样类型的字符能够是由 1~6 个字节组成。htm
UTF-8 有如下编码规则:
- 若是一个字节,最高位(第 8 位)为 0,表示这是一个 ASCII 字符(00 - 7F)。可见,全部 ASCII 编码已是 UTF-8 了。
- 若是一个字节,以 11 开头,连续的 1 的个数暗示这个字符的字节数,例如:110xxxxx 表明它是双字节 UTF-8 字符的首字节。
- 若是一个字节,以 10 开始,表示它不是首字节,须要向前查找才能获得当前字符的首字节