java中char与汉字占用字节个数问题
2015-06-15 09:09
260 查看
http://maimode.iteye.com/blog/1341354
一直都是糊里糊涂的在用,始终没有搞清楚汉字在java中占用字节个数的问题,每次都是逃避着过去了。今天一个字节编码问题让我不得不去重新认识char与汉字编码这个问题。
下面是引用一个讨论中的资料:
http://www.iteye.com/topic/47740 写道
(由于原作者将字节和位写混淆了,引用时我已做过更改)
貌似一个简单的问题(也许还真是简单的)但是却把曾经自认为弄清楚的我弄得莫名其
妙
char在Java中应该是16个bit
byte在Java中应该是8个bit
char x = '编'; //这样是合法的,输出也是16个bit
但是
String str = "编";
byte[] bytes = str.getBytes(); //我想不明白,为什么这里要占用3个byte呢?
3个byte一共是3*8=24个bit,那么char x怎么又放得下?我坚信char是16个bit,
但是str.getBytes()这个东西到底又怎么回事?
不好意思,表达有点乱,但是的确太奇怪了。希望大家能指点一下。
skydream 写道
首先,java中的一个char的确是2个字节。java采用unicode,2个字节来表示一个字符。
其次,楼主你说的byte[] bytes = str.getBytes();之后是3个字节,这里和前面的概念不一样。java是用unicode来表示字符,"编"这个中文字符的unicode就是2个字节。String.getBytes(encoding)方法是获取指定编码的byte数组表示,通常gbk/gb2312是2个字节,utf-8是3个字节。如果不指定encoding则取系统默认的encoding.
kdekid 写道
首先,要搞清楚 code point 和 encoding 的区别。Java 是遵循 unicode 4.0 标准的,而内部的 character 以 utf-16 作为 encoding。unicode 4.0 标准包含从 U+0000-U+FFFF 的基本多语言平面和 U+10000-U+10FFFF 的扩展平面的文字,这是 code point。Java 的 char 类型是 16 bit 的,所以单个 char 只支持基本平面内的文字,而扩展平面的文字是由一对 char 来表示的。
而 String.getBytes() 这个方法是按照指定的 encoding 返回字符串,一般中文系统的默认编码是 utf-8 (linux, mac) 或者 gbk/gb18030 (windows)。只要是基本平面内的文字,utf-8码的中文都是3字节的,而 gbk/gbk18030 是2字节的。
一直都是糊里糊涂的在用,始终没有搞清楚汉字在java中占用字节个数的问题,每次都是逃避着过去了。今天一个字节编码问题让我不得不去重新认识char与汉字编码这个问题。
下面是引用一个讨论中的资料:
http://www.iteye.com/topic/47740 写道
(由于原作者将字节和位写混淆了,引用时我已做过更改)
貌似一个简单的问题(也许还真是简单的)但是却把曾经自认为弄清楚的我弄得莫名其
妙
char在Java中应该是16个bit
byte在Java中应该是8个bit
char x = '编'; //这样是合法的,输出也是16个bit
但是
String str = "编";
byte[] bytes = str.getBytes(); //我想不明白,为什么这里要占用3个byte呢?
3个byte一共是3*8=24个bit,那么char x怎么又放得下?我坚信char是16个bit,
但是str.getBytes()这个东西到底又怎么回事?
不好意思,表达有点乱,但是的确太奇怪了。希望大家能指点一下。
skydream 写道
首先,java中的一个char的确是2个字节。java采用unicode,2个字节来表示一个字符。
其次,楼主你说的byte[] bytes = str.getBytes();之后是3个字节,这里和前面的概念不一样。java是用unicode来表示字符,"编"这个中文字符的unicode就是2个字节。String.getBytes(encoding)方法是获取指定编码的byte数组表示,通常gbk/gb2312是2个字节,utf-8是3个字节。如果不指定encoding则取系统默认的encoding.
kdekid 写道
首先,要搞清楚 code point 和 encoding 的区别。Java 是遵循 unicode 4.0 标准的,而内部的 character 以 utf-16 作为 encoding。unicode 4.0 标准包含从 U+0000-U+FFFF 的基本多语言平面和 U+10000-U+10FFFF 的扩展平面的文字,这是 code point。Java 的 char 类型是 16 bit 的,所以单个 char 只支持基本平面内的文字,而扩展平面的文字是由一对 char 来表示的。
而 String.getBytes() 这个方法是按照指定的 encoding 返回字符串,一般中文系统的默认编码是 utf-8 (linux, mac) 或者 gbk/gb18030 (windows)。只要是基本平面内的文字,utf-8码的中文都是3字节的,而 gbk/gbk18030 是2字节的。
相关文章推荐
- Java中一个for语句导致无穷大死循环的例子
- JAVA经典实例
- struts2实现文件上传进度条(前端JS+Java)(自我整理)
- mac和windows下的eclipse不同编码
- Java内存理解 && 反射访问私有属性或方法
- Java中遍历数组使用foreach循环还是for循环?
- maven3.3不支持JDK1.6
- Java中使用异或语句实现两个变量的互换
- Java中使用While语句自增运算遍历数组典型实例
- struts2 通过源码了解action生命周期过程
- Java中switch判断语句典型使用实例
- Java中使用异或运算符实现加密字符串
- 常用 Java 静态代码分析工具的分析与比较
- java 数组
- java面向对象(二)
- java面向对象(一)
- spring mvc 知识总结
- 【Java】 ArrayList [1]
- OpenJTAG+Eclipse 3.5+GDB+Mini2440图文教程
- OpenJTAG+Eclipse 3.5+GDB+Mini2440图文教程