一直都是糊里糊涂的在用,始终没有搞清楚汉字在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[] 和 String 类型都是常用的数据类型,但是在实际应用中,开发者经常会遇到关于这两个类型占用字节大小的问题。下面我们将通过实例代码来详细介绍 Java 中 char[] 和 String 类型占用字节大小...
### Java中的char与byte的区别详解 #### 一、引言 在Java编程语言中,`char` 和 `byte` 是两种基本的数据类型,它们分别用于处理字符和数值数据。尽管这两种类型都用来存储数据,但它们之间存在着显著的差异。本文...
在Java编程语言中,处理带有汉字的字符串时,由于汉字占据多个字节,按照字节进行截取可能会导致汉字被不完整地分割,从而产生乱码。为了解决这个问题,我们需要理解Unicode编码以及如何在Java中正确处理多字节字符...
UTF-16编码使用2个或4个字节来表示一个字符,其中大部分的常用Unicode字符(包括大部分汉字)只需要2个字节,这就是为什么描述中提到的“Unicode编码占用两个字节,所以,char类型的变量也是占用两个字节”的原因。...
汉字通常使用Unicode编码,如GBK或UTF-8,每个汉字占用2至4个字节,而数字是字符型数据,如'0'到'9',在ASCII码中每个数字占用一个字节。这就意味着在比较时,如果不进行特殊处理,数字会按照其字典顺序(ASCII值)...
根据题目提供的信息,我们来详细讨论一下`char`在Java中的占用字节数及其相关知识。 首先,我们需要理解基本的数据单位。在计算机科学中,"字节"(Byte)是最常见的数据单位,通常由8个"位"(Bit)组成。1位(Bit)...
由于Java默认使用Unicode字符编码,每个字符(char)占用2个字节(byte),因此对于中文字符来说,其占用的字节数也通常是2个。 在这个特定的题目中,我们关注的是如何从包含中文的字符串中准确截取特定长度的字符...
* byte:一个字节的整数类型 * short:一个短整数类型 * int:一个整数类型 * long:一个长整数类型 * float:一个浮点数类型 * double:一个双精度浮点数类型 * char:一个字符类型 * boolean:一个布尔类型 ...
在Java编程中,有时我们需要按照字节长度来截取字符串,尤其在处理中文字符时,因为一个中文字符在UTF-8编码下占用两个字节,而一个英文字符仅占用一个字节。这样的需求通常出现在前端展示限制或者传输数据时,避免...
在Java编程语言中,处理包含汉字的字符串时,由于汉字在不同编码格式下占用的字节数不同,按字节截取字符串会面临特殊挑战。本文将深入探讨如何正确地按字节截取带有汉字的字符串,以确保不出现半字符或者乱码的情况...
在字符的表示中,char类型本质上是一个固定占用两个字节的无符号整数。这意味着它实际上是用一个整数来代表字符,这个整数便是字符的Unicode编码。Unicode是一个国际标准,用于唯一标识文本中的字符。 在Java内部...
中文字符在Java中是以Unicode编码存储的,每个字符占用两个字节。而拼音转换则需要将Unicode字符映射到其对应的汉语拼音表示。 在Java中,没有内置的函数直接完成这个任务,所以我们通常会依赖第三方库,如Pinyin4j...
- 当字符串包含汉字时,`getBytes()` 方法返回的字节数组长度会小于字符串的长度(因为每个汉字通常占用多个字节),此时 `result` 返回 `true`。 - 如果字符串中不含汉字,则 `result` 返回 `false`。 #### 四、...
2. `out.print(new String(test.getBytes(), "GBK"))`尝试将UTF-8编码的字符串转换为GBK,但由于原始字符串已经是UTF-8,转换后的结果每个中文字符通常会占用4到5个字节,导致C++解码失败。 3. `out.print(new ...
boolean类型不明确指定占用字节数,而char类型占用2个字节,用于存储Unicode编码的字符,可以存储中文汉字,因为Unicode包含了中文字符集。 2. **String类型**:String不是基本数据类型,它是一个对象。String类是...
Java语言内部使用Unicode编码,具体来说是UTF-16格式,这意味着每个`char`类型变量能够表示一个Unicode字符,通常占据两个字节。UTF-16编码方式确保了Java能够处理几乎所有的世界语言。 当使用`String.getBytes()`...
例如,在UTF-8编码中,中文字符通常占用3个字节,而在GBK编码中,则可能占用2或4个字节。因此,在计算字符串长度时,必须考虑到实际的编码方式。 2. **字符与字节的区别**:在讨论字符串长度时,需要区分字符数和...
一个汉字占用两个字节,即两个char类型。 #### 基本数据类型之间的自动转换 Java的基本数据类型之间可以进行自动转换,这种转换遵循一定的规则。转换顺序如下: - Byte < Short < Char - Float - Int - Long ...
* char类型占用2个字节,范围从0到65535。 * char类型可以使用单引号或unicode编码表示。 三、运算符 * 运算符是Java语言中的基本操作符,用于执行各种操作。 * 移位运算符包括左移、右移和无符号右移,用于将数字...
在ASCII编码中,一个英文字符通常占用一个字节,而汉字通常使用双字节编码,如GBK或UTF-8。编码方式不同,字符占用的字节数也会有所变化。字节是计算机存储的基本单位,而字符是文本的表示形式。位(bit)是信息的...