编码 -- char 1= '中' 2 byte, 中文string a="中" 3字节问题
2011-06-20 17:21
323 查看
char在Java中应该是16个字节
byte在Java中应该是8个字节
char x = '编'; //这样是合法的,输出也是16个字节
但是
String str = "编";
byte[] bytes = str.getBytes(); //我想不明白,为什么这里要占用3个byte呢?
3个byte一共是3*8=24个字节,那么char x怎么又放得下?我坚信char是16个字节,
但是str.getBytes()这个东西到底又怎么回事?
解答1:
首先,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.
另外,楼主的“字节”说的有点乱,通常我们说的字节是指byte,还有一个"位"的概念(bit)
,通常情况下1 byte=8 bit.
"3个byte一共是3*8=24个字节"这句话应该表示为“3个byte一共是3*8=24个bit”
解答2:
首先,要搞清楚 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字节的
。
byte在Java中应该是8个字节
char x = '编'; //这样是合法的,输出也是16个字节
但是
String str = "编";
byte[] bytes = str.getBytes(); //我想不明白,为什么这里要占用3个byte呢?
3个byte一共是3*8=24个字节,那么char x怎么又放得下?我坚信char是16个字节,
但是str.getBytes()这个东西到底又怎么回事?
解答1:
首先,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.
另外,楼主的“字节”说的有点乱,通常我们说的字节是指byte,还有一个"位"的概念(bit)
,通常情况下1 byte=8 bit.
"3个byte一共是3*8=24个字节"这句话应该表示为“3个byte一共是3*8=24个bit”
解答2:
首先,要搞清楚 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字节的
。
相关文章推荐
- 编码 -- char 1= '中' 2 byte, 中文string a="中" 3字节问题
- 解决var url="xxx&参数名="+“中文参数”; 传到后台根据String x = request.getParameter("中文参数名");乱码问题
- "std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::str() const"问题的解决办法
- 利用Gate进行中文信息抽取时 不能识别Token.string=="中文"的问题
- python脚本处理文本时遇到的字符问题:UnicodeDecodeError: " " codec can't decode byte
- byte[]、String转换中文编码问题
- Pyhotn 中编码的问题:'ascii' codec can't decode byte 0xef in position 0: ordinal not in range(128)的错误
- jquery.get的参数中文自动编码与header(\'Content-type: text/html; charset=gbk\');乱码问题
- Conversion from string literal to 'char *' is deprecated 问题原因
- amule: FTBFS ("cannot convert 'UpnpString* {aka s_UpnpString*}' to 'const char*'")
- mysql问题 Incorrect string value:"/ / / / /"for column'trurname' at row 1
- python 处理中文时出现的错误'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)" 解决方法
- webpy 解决中文出现UnicodeDecodeError: 'ascii' codec can't decode byte 问题
- python 处理中文时出现的错误'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)" 解决方法
- what's the difference between NULL 0 '\0' and ""/''(space string or char) ?
- C# 转换uint,byte[],char[],string, short[]<->byte[] 结构体和字节数组转化
- 解决vs2013下创建的python文件,到其他平台(如linux)下中文乱码(或运行时报SyntaxError: (unicode error) 'utf-8' codec can't decode byte...)
- python 写文件 包含中文 'ascii' codec can't decode byte 0xe8
- 中文写入数据库乱码及Incorrect string value: '\xF0\x9F...' for column 'XXX' at row 1解决
- mysql 中插入中文出现的 Incorrect string value: '\xE5\xA5\xBD\xE5\xAE\xB6...' from column错误