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

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改成别的数就会出现异常。求高人讲解!!
楼主的问题是off+len>b.length了,就是写入的输出字节数超出了要写入的字节的长度;就好像我要只有4个字节的文字,却要输出到第5个字节,那当然会报错啦~~

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值