关于字符编码,中文所占字节的整理。

本文深入探讨字符编码,从1个字节的ASCII到2个字节的GBK、GB2312,再到UTF-8的多字节表示。解释了为何一个字节无法表示所有字符,以及Unicode如何通过16位或32位编码解决这一问题,同时介绍了Unicode的UTF-8、UCS-2和UTF-16编码。内容涉及字符集编码的历史发展,包括ASCII、扩展ASCII、DBCS以及Unicode的实现,如UTF-8、UCS-2和UTF-16在不同平台和环境的应用。

1个字节byte=8bit(比特/位)  1bit=0.125B字节

1个汉字两个字节 16bit,2B.

字符:汉字,数字,字母等

Byte,bit是存储单位

Bit——比特
B ——字节 
KB——千字节 
MB——兆字节 
GB——吉字节 
TB——太字节 

1B=8 Bit
1KB1024B 
1MB1024KB 
1GB1024MB 
1TB=1024GB


中文不止2的8次方个255个字符。所以一个字节肯定不能表示。

你可能回想两个字节2的16次方65 536。Gbk收录的字数没有超过这数量。因此GBK、GB2312收编的汉字占2个字节。但是没这么简单,除了中文外还有其他的文字。

 

常用中文字符用utf-8编码占用3个字节(大约2万多字),但超大字符集中的更大多数汉字要占4个字节(在unicode编码体系中,U+20000开始有5万多汉字)。


相关补充:

 

 

 

我们知道机器只知道字节,而字符却是语义上的单位,它是有编码的,一个字符可能编码成1个2个甚至3个4个字节。这跟字符集编码有关系,英文字母和数字是单字节,但汉字这些自然语言中的字符是多字节的。一个字节只能表示255个字符,不可能用于全球那么多种自然语言的处理,因此肯定需要多字节的存储方式。


当我们在处理 Java 时,比如 InputStream, OutputStream 它们是处理字节流的,就是说假设所有东西都是二进制的字节,而 Reader, Writer 则是字符流,它涉及到字符集的问题,因为把一个字符保存到磁盘或读取出来需要指定一个字符集,平时你的代码没有指定是因为 JVM 读取操作系统默认的字符集,有时候(特别是数据交换的时候)可能这个默认字符集不正确。
在 Java 中,它的内核是使用 Unicode,也就是说它记住了每个字符的 Unicode 内部编码(一串数字,全球唯一,各国语言常用字符全部在里面,比如康熙字典这种古董中的多数汉字都在其中),只有把字符串通过网络发送出去或保存到磁盘上或反过来读取时才有字符编码成字节的过程,因为一个字符多个字节我们需要知道每个字符的这几个字节是按什么顺序排列的,第1个字节排前面还是排后面,多个字符串在一起时在读取时怎么识别出哪几个字节凑在一起是一个字符,这就是字符集编码方案了,UTF8, GBK, GB2312, GB18030, BIG5,之类的都是其中一种字符集编码方案。


inputStream 读的是字节流,inputStreamReader inputStreamReader的桥梁。Reader支持16位的Unicode字符输出,

InputStream支持8位的字符输出。InputStream 用于读入 ASCII 字符和二进制数据。


write(byte[] b,int off,int len)中的off偏移量具体指的是什么?
byte[] words = str.getBytes();
fos = new FileOutputStream("c:/test.txt");//此文件输出流对象fos就和目标数据源(c:/test.txt)联系起来了。
fos.write(words, 0, words.length);//利用write方法将数据写入到文件中去
System.out.println("文件已更新!");
这是代码,我把0改成别的数就会出现异常。求高人讲解!
<think>好的,我现在需要回答用户关于汉字、字符字节用及编码规则的问题。用户之前提到了几个引用,我需要参考这些信息,同时结合自己的知识来组织答案。首先,我得理清不同编码方式下的差异,比如GBK、UTF-8等。 首先,用户想知道汉字和其他字符在不同编码中的字节用情况。根据引用[2],GBK编码下,汉字2字节,而UTF-8下3字节。英文在两种编码中都是1字节。需要明确说明不同编码的区别,这可能影响存储和处理方式。 接下来,用户可能关心如何实际计算字符串的字节长度,比如在JS和Python中的方法。引用[2]提到了使用Blob对象来获取字节长度,而引用[3]则提到Python中使用encode方法。这部分需要分点说明,给出代码示例,帮助用户理解具体实现。 然后,需要解释编码规则的基本原理,比如为什么GBK和UTF-8有不同的字节用。引用[1]提到中文字符使用两个字节且高位为1,这可能涉及有符号和无符号类型的问题。不过这里可能需要更准确的解释,避免误解。例如,GBK使用双字节,其中每个字节可能使用高位来标识是否属于中文字符,而UTF-8使用可变长度编码,通过前缀位来区分不同长度的字符。 用户的问题可能还涉及为什么不同编码会有不同的字节需求,这涉及到编码设计的背景,如兼容性、存储效率等。例如,UTF-8是为了兼容ASCII并支持更多字符而设计的,而GBK主要用于简体中文环境,节省空间。 另外,需要注意不同编程语言中处理字符串的差异。例如在Python中,字符串默认是Unicode,所以转换为字节需要指定编码方式,而JS中可能需要通过Blob或Buffer来处理。这部分需要具体举例,确保用户能理解如何在不同环境中应用。 最后,生成相关问题时要考虑用户可能的后续疑问,比如编码转换的问题、实际应用中的注意事项,或者处理混合字符串时的挑战。例如,如何避免乱码,不同编码对网络传输的影响等。 在整理回答时,要确保结构清晰,分点说明不同编码的规则、不同字符的字节用,以及实际编程中的处理方法。同时,引用用户提供的参考资料,正确标注引用标识,如[^2]和[^3],确保信息准确可靠。需要避免技术错误,比如混淆编码类型或错误的字节数,并确保示例代码正确无误。 可能还需要补充一些细节,比如ASCII字符的范围,Unicode的发展,以及为什么UTF-8成为主流编码。但根据用户的问题,保持回答简洁,重点在字节用和编码规则上,不过多展开历史背景。 总结回答的结构:首先概述编码的重要性,然后分点介绍GBK、UTF-8等编码下的字节用,接着给出不同编程语言中的获取方法,最后解释编码规则的基本原理。这样用户能逐步理解从基础概念到实际应用的整个过程。</think>### 汉字、字符的字节用与编码规则详解 #### 一、编码规则与字节用的关系 字符的字节用由编码规则决定,不同编码标准对汉字、英文字符的存储方式差异较大: 1. **GBK/GB2312编码** - **汉字/中文字符**:每个字符用 **2字节** 这两个字节的最高位均为1,通过组合形成中文字符的编码[^1]。 - **英文字符**:用 **1字节**(兼容ASCII码) 例如:字符 `A` 存储为 `01000001`。 2. **UTF-8编码** - **汉字/中文字符**:每个字符用 **3字节** UTF-8采用可变长编码汉字属于Unicode中较靠后的字符集,需3字节表示[^2]。 - **英文字符**:用 **1字节**(完全兼容ASCII码) 例如:字符 `B` 存储为 `01000010`。 3. **Unicode标准** - 统一为每个字符分配唯一码点(如汉字“中”的码点为 `U+4E2D`),但实际存储依赖具体编码实现(如UTF-8、UTF-16)。 #### 二、不同编程语言中的字节长度获取方法 1. **JavaScript** 使用 `Blob` 对象获取字符串的字节长度: ```javascript let str = "你好ABC"; let byteLength = new Blob([str]).size; // UTF-8下结果为 3*3 + 3*1 = 12字节[^2] ``` 2. **Python** 通过字符串的 `encode()` 方法指定编码后计算字节数: ```python s = "你好ABC" gbk_bytes = s.encode('gbk') # GBK编码,长度=2*2 + 3*1 = 7字节 utf8_bytes = s.encode('utf-8') # UTF-8编码,长度=2*3 + 3*1 = 9字节[^3] ``` #### 三、编码规则的核心原理 1. **字节高位标识** - 在GBK中,若首字节的最高位为1,则表示与后续字节共同组成一个汉字[^1]。 - 在UTF-8中,首字节的前缀 `1110xxxx` 表示后续有2个字节共同组成一个字符。 2. **兼容性与扩展性** - **GBK**:专为中文设计,空间效率高,但无法支持全球字符。 - **UTF-8**:支持所有Unicode字符,已成为互联网主流编码。 #### 四、实际应用注意事项 1. **编码一致性** 文件读写、网络传输时需统一编码,否则可能导致乱码(如用UTF-8解码GBK字节流)。 2. **存储优化** 若系统仅需支持中文和英文,GBK比UTF-8节省空间(汉字少1字节)。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值