关于GBK中的英文字符占用一个字节还是两个字节的问题

网上大部分的说法是:GB2312能完美的支持简体中文和英文,一个中文文字占用2个字节,一个英文字母同样占用2个字节。
可是我在windows下或linux下(确认是gbk编码)测试中发现英文字母占用一个字节,这是怎么回事?

例:a你b好,编码是:61 C4 E3 62 BA C3



英文字母是1byte.
lz 如果想感受2byte的字符,可以用全角试一下.


再次确认一下,gbk的26个字母确实是一个字节,utf8的也是一个字节。

只有utf-16占用两个


GB 系列编码是利用了字节中的最高位和ASCII编码区分的。
所以可以和ASCII码混用。


GBK中字符是一个或者两个字节,单字节00–7F这个区间和ASCII是一样的;双字节字符的第一个字节在81-FE之间,通过这个可以判断是单字节还是双字节


GB2312中1区到15区共682个字符或图形符号都是 全角方式下 的字符。即:
若byte[] bb="hello".getBytes("gb2312");(注意是全角方式下),bb字节数组的长度就会是10了。
因此:gb2312中的所有字符都是用二个字节表示(是因为:它的字符都是全角方式)。 gb2312中不会对半角方式下的字符编码的(这是ASCII码的事情 ),因此:在getBytes("gb2312");转换时,半角的字符都是一个字节,全角的同样字符才是两个字节。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 可以使用Java的getBytes()方法来获取字符串的字节数组,然后统计字节数组的长度即可。需要注意的是,字符在UTF-8编码占用3个字节,而在GBK编码占用2个字节,因此需要根据具体的编码方式来计算字节数。 以下是一个示例代码: ``` public static int getByteLength(String str, String charset) { try { byte[] bytes = str.getBytes(charset); return bytes.length; } catch (UnsupportedEncodingException e) { e.printStackTrace(); return -1; } } ``` 其,str为要计算字节长度的字符串,charset为字符串的编码方式。如果编码方式不支持,会抛出UnsupportedEncodingException异常。 ### 回答2: 在Java字符串的长度可以使用length()方法来获取字符的数量,但是这个值并不能代表字符串所据的字节数。因为在Java一个字符可能占用1个或2个字节的空间,如何计算字符串的字节数呢?下面是一个求解字符字节数的方法。 首先,我们可以将字符串转换成字节数组,然后遍历每一个字节,并判断它和它后面的字节是否组成一个完整的字符,如果是,那么就只算一个字符,如果不是,那么就算两个字符。使用代码实现如下: ```java public static int getBytesLength(String str) { if (str == null) { return 0; } int length = 0; byte[] bytes = str.getBytes(); for (int i = 0; i < bytes.length; i++) { if ((bytes[i] & 0xff) <= 0x7f) { // ASCII字符 length++; } else { // 字符 length += 2; if ((bytes[i] & 0xff) >= 0xe0 && (bytes[i] & 0xff) <= 0xef) { // 三字节及以上字符 i += 2; } else { // 两字节字符 i++; } } } return length; } ``` 该方法传入一个字符串,返回该字符串的字节数。先判断字符串是否为空,如果是,那么就返回0;使用getBytes()方法将字符串转换成字节数组,然后遍历每一个字节,如果该字节是ASCII字符,那么就算1个字符,否则就算2个字符。如果该字节是三字节及以上的字符,那么就跳过后面的两个字节(因为它们组成了一个完整的字符),如果是两字节字符,那么就跳过后面的1个字节。最后返回该字符串的字节数。 使用该方法可以很方便地计算一个字符串所据的字节数,特别是在使用文本处理程序进行文件处理时,能够确保程序正确处理字符。 ### 回答3: 为了求一个字符串的字节长度,我们需要先遍历字符的每一个字符,并计算出每个字符占用字节数。在这个过程我们可以使用 Java 语言提供的 String 类的 charAt 方法来获取每个字符,使用 if-else 语句来判断每个字符英文还是文,并计算出对应的字节数。 具体的实现方法如下: public static int getByteLength(String str) { int length = 0; // 记录字符字节长度 if (str != null) { // 首先校验字符串是否为空 for (int i = 0; i < str.length(); i++) { // 遍历字符的每一个字符 char c = str.charAt(i); // 获取字符 if (c <= 127) { // 判断是否为 ASCII 码 length++; // 英文字符占用一个字节 } else { // 字符占用两个字节 length += 2; } } } return length; // 返回字符字节长度 } 在上述方法,我们首先判断了给定的字符串是否为空。如果不为空,我们使用一个 for 循环来遍历字符的每一个字符。在循环,我们通过 charAt 方法获取每个字符,然后使用 if-else 语句判断每个字符英文字符还是字符,并计算出对应的字节数。最后,我们将得到的字节数累加到变量 length ,然后将其返回。 需要注意的是,字符占用两个字节的现象只适用于 GBK 和 GB2312 编码,对于 UTF-8 编码来说,字符占用三个字节。因此,在实际开发,我们需要根据实际情况来选择适当的编码方式,并根据编码方式的不同来计算相应的字符字节长度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值