【计算机基础】字符集与字符编码

在编程过程中,字符的编码问题不可避免。以Web应用为例,HTTP协议中报文头里的Accept-Charset、Accept-Encoding、Content-Encoding等就是字符编码的一种体现。当我们充分理解字符编码的原理后,我们就可以避免再看到诸如??OY}T??N*NuL?乱码的情况。

基本概念

编码:把一种信息格式转换为另一种信息格式。对与计算机而言,此过程是把我们自然世界里的字符、声频、音频等转换为二进制形式。
解码:编码的逆过程。
乱码:不能正确显示字符的现象,原因多是编码与解码所用的映射关系不匹配。
字符集:某一系统所有字符的集合。如:中文字符集包括汉字、汉字符号等。
字符编码:把字符集中的字符编码成指定集合中的对象。如Unicode编码、GB2312字符编码。通常,人们认为字符集和字符编码是同义词(因为特定的字符编码会有唯一的字符集与之对应)。

各国编码

了解了编码的基本概念之后,我们需要明确一下,各国是如何对本国字符进行编码的:
ASCII编码
由于计算机是西方国家产物。因此,在计算机被发明的很长时间内,都是使用一种叫ASCII码的东西对西方国家常用的字符进行编码。
ASCII使用一个字节存储字符,且第一位同一为0,实际只能表示128个字符。对应的码表可以在这个网站查看。
各国独立编码
虽然ASCII对于美国等西方国家使用时勉强足够,但是对非英语系的国家而言,其字符远远不知128个,因此,各国纷纷拟定能够容纳本国字符的编码。比方中国的GB2312编码、日本的ISO2022编码。
Unicode编码
各国使用各自的编码,在本国使用当然不会有问题。如果编码的对象需要在互联网上传输、共享,还是会有乱码的发生。因此,一个怀着「把世界上所有的字符都用同一编码」伟大梦想的,统一码联盟诞生了。这个联盟拟定的编码方式如:UTF-32(使用4个字节存储一个字符);UTF-16(使用2个字节存储一个字符);UTF-8(使用1-4个字节变长编码)等实现。
UTF-8编码
我们知道UTF-8编码只是Unicode编码的一种实现,但在编程中,UTF-8也是最经常使用的。因此,这里简单介绍一下UTF-8的编码策略。
对于UTF-8编码的字符,第一个字节里的高x位1表示该字符用x位字节编码;接下来的x位前两位必是10。下面的表格简单模拟了UTF-8编码过程:

码点位数码点起值码点终值字节序列Byte1Byte2Byte3Byte4Byte5Byte6
7U+0000U+007F10xxxxxxxNULLNULLNULLNULLNULL
11U+0080U+07FF2110xxxxx10xxxxxxNULLNULLNULLNULL
16U+0080U+FFFF31110xxxx10xxxxxx10xxxxxxNULLNULLNULL
21U+10000U+1FFFFF411110xxx10xxxxx10xxxxxx10xxxxxxNULLNULL
26U+200000U+3FFFFFF5111110xx10xxxxxx10xxxxxx10xxxxxx10xxxxxxNULL
31U+4000000U+7FFFFFFF61111110x10xxxxxx10xxxxxx10xxxxxx10xxxxxx10xxxxxx

由上面的表格可以看出,当高1位为0时,UTF-8编码和ASCII编码一致。

编码应用

在JEE开发过程中,假定有如下JSP页面:

<%@ page pageEncoding="UTF-8" contentType="text/html;charset=UTF-8"%>
<%
    out.print("中国");
%>

在这里:

  • pageEncoding:JSP转换成Servlet时使用的编码

  • contentType:获取printWriter时,使用的编码

两者使用的映射一样,不会出现乱码。

参考文献

维基百科|字符编码
维基百科|UTF-8

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值