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的转换