字符集的一些疑惑
标准ASCII字符集#
计算机由美国人发明,所以要存储英文字母,数字,标点符号,于是进行编号,产生ASCII
字符集,0-127,使用1个字节
存储
GBK#
但是中文有很多,于是产生了GBK(汉字编码字符集),包含2W多个汉字等字符,GBK中一个中文字符编码用两个字节
存储
注:GBK兼容了ASCII字符集
我a你 表示为 xxxxxxxx xxxxxxxx 0xxxxxxx xxxxxxx xxxxxxxxx ,计算机如何识别
GBK规定:汉字的第一个字节必须为1,来进行区别
Unicode字符集#
一个国家有一个字符集的话,传输会有问题
国际组织制定了统一码:下面的两种方案
UTF-32
:4个字节标识一个字符,太过浪费,且效率变低
UTF-8
:可变长编码方案,共分为四个长度区:1个字节,2个字节,3个字节,4个字节
英文字符,数字等占一个字节
(兼容ASCII编码),汉字字符占用3个字节
a我m 0xxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 0xxxxxxx 如何识别
a 97 01100001
我 25105 110 001000 010001
m 109 01101101
解决方案:
0xxxxxxx (ASCII码)
110
xxxxx 10xxxxxx
1110
xxxx 10xxxxxx 10xxxxxx
11110
xxx 10xxxxxx 10xxxxxx 10xxxxxx
总结#
字符编码时所使用的字符集,和解码时使用的字符集必须一致,否则会乱码
英文,数字一般不会乱码,因为很多字符集都兼容ASCII编码
使用Java程序对字符进行编码,解码#
编码
String提供如下方法 | 说明 |
---|---|
byte[] getBytes() | 使用平台默认字符集将String编码为字节,结果存储到新的字节数组中 |
byte[] getBytes(String charsetName) | 使用指定的字符集将String编码为字节,结果存储到新的字节数组中 |
//默认字符集
String data = “a我m”;
byte[] bytes2 =data.getBytes();
System.out.println(Arrays.toString(bytes));
//指定字符集
String data = “a我m”;
byte[] bytes2 =data.getBytes(“GBK”);
System.out.println(Arrays.toString(bytes));
解码
String提供如下方法 | 说明 |
---|---|
string(byte[] bytes) | 使用平台默认的字符集解码指定的字节数组来构造String |
string(byte[] bytes, String charsetName) | 使用指定的字符集解码指定的字节数组来构造String |
//默认字符集
string s1 = new String(bytes);
//指定字符集
string s1 = new String(bytes,"GBK");
作者:gk0d
出处:https://www.cnblogs.com/gk0d/p/16890478.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
留言: 如果文中有什么错误,欢迎指出。以免更多的人被误导
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix