bit称为位:只能拥有一个值,不是0就是1
Byte称为字节,包括8个bit.一个英文字符占一个字节
Char:字符,表示一个 Unicode 字符,占两个字节,即16 位(bit).范围为从十六进制值 0x0000 到 0xFFFF
unicode都是以16进制表示.getBytes是ascii码表示的.\u是指uniode码
一个16进制占用4个bit,2个16进制为一个字节。
ANSI 编码
每个汉字占2个字节,每个英文和数字字符占1个字节
UNICODE
计算机存放字符串时,改为存放每个字符在 UNICODE 字符集中的序号.目前计算机一般使用 2 个字节(16 位)来存放一个序号(DBCS),因此,这种方式存放的字符也被称作宽字节字符.
在UNICODE中,此时英文和数字也占两个字节.且低位的字节在前。
UNICODE 字符串来说,不管在什么环境下,它所代表的“字符”内容总是不变的。
java中的String是以UNICODE存储的.java使用UTF-16表示内部文本
非 UNICODE 程序中的字符串,都是以某种 ANSI 编码形式存在的。如果程序运行时的语言环境与开发时的语言环境不同,将会导致 ANSI 字符串的显示失败。
比如,在日文环境下开发的非 UNICODE 的日文程序界面,拿到中文环境下运行时,界面上将显示乱码。如果这个日文程序界面改为采用 UNICODE 来记录字符串,那么当在中文环境下运行时,界面上将可以显示正常的日文。
在oracle中
用字节指定:varchar2(12 byte):表示支持最多12字节的数据
用字符指定:varchar2(12 char):表示支持最多12字符数据.可能是多达40字节的信息.
默认值是byte.
如果是utf8,中文占3个字节.
在java中
char 数据类型(和 Character 对象封装的值)基于原始的 Unicode 规范,将字符定义为固定宽度的 16 位实体.java中全部用的是UTF-16.
UTF16-BE:高字节BYTE在前 UTF16-LE:低字节BYTE在前
java中 如果没有feff的标志,则默认为 feff.
java中的数组类型全是有符号的.所以unicode码很多被表示为负数.
char是无符号的,所以虽然short也是2个字节,大小范围却不同.
- tomcat的乱码
在一个编码为 GB2312 的页面,提交 "中" 这个字符串时,提交给服务器的内容为 "%D6%D0".
tomcat默认的是iso-8859-1,会把每一个字节当成一个字符(西方的习惯),所以生成两个char,oxD6和oxD0,再由char生成String。在unicode中oxD6为Ö.所以要使用getBytes得到原始的byte,然后使用 GB2312编码.
String.codePointAt,可以得到String中的第i个元素的unicode编码. - java中的String
new String,是指让系统把bytes中的数据由encoding指定的编码方式转换成unicode编码
getBytes("gb2312")方法,是指让系统将unicoder的编码,转换成"gb2312"的编码.
String中是以char的数组存储的,char的值是unicoder的编码.一个char代表一个字符...(///代理位的问题,String,char的feff,ffff问题)
如"中"的unicode码是4E2D,getBytes("gb2312")方法,根据4E2D得到"中",再"中"的gb2312码查找得到d6d0.
new String相反的,根据 gb2312由bytesd6d0由bytes找到"中",再由"中"找到unicode码,放入String的char数组中.
java中的转换的本质是byte和char的转换
不错的文章
http://www.cnblogs.com/maxupeng/archive/2011/06/22/2087579.html
http://java.chinaitlab.com/base/725356.html
http://blog.csdn.net/why0603_2000/article/details/7516431