1. 编码问题的由来,相关概念的理解
1.1 字符与编码的发展
从计算机对多国语言的支持角度看,大致可以分为三个阶段:
|
系统内码 |
说明 |
系统 |
阶段一 |
ASCII |
计算机刚开始只支持英语,其它语言不能够在计算机上存储和显示。 |
英文 DOS |
阶段二 |
ANSI编码 (本地化) |
为使计算机支持更多语言,通常使用 0x80~0xFF 范围的 2 个字节来表示 1 个字符。比如:汉字 '中' 在中文操作系统中,使用 [0xD6,0xD0] 这两个字节存储。
不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。
不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。 |
中文 DOS,中文 Windows 95/98,日文 Windows 95/98 |
阶段三 |
UNICODE (国际化) |
为了使国际间信息交流更加方便,国际组织制定了 UNICODE 字符集,为各种语言中的每一个字符设定了统一并且唯一的数字编号,以满足跨语言、跨平台进行文本转换、处理的要求。 |
Windows NT/2000/XP,Linux,Java |
字符串在内存中的存放方法:
在 ASCII 阶段,单字节字符串使用一个字节存放一个字符(SBCS)。比如,"Bob123" 在内存中为:
42 |
6F |
62 |
31 |
32 |
33 |
00 |
|
|
|
|
|
|
|
B |
o |
b |
1 |
2 |
3 |
\0 |
在使用 ANSI 编码支持多种语言阶段,每个字符使用一个字节或多个字节来表示(MBCS),因此,这种方式存放的字符也被称作多字节字符。比如,"中文123" 在中文 Windows 95 内存中为7个字节,每个汉字占2个字节,每个英文和数字字符占1个字节:
D6 |
D0 |
CE |
C4 |
31 |
32 |
33 |
00 |
|
|
|
|
|
|
中 |
文 |
1 |
2 |
3 |
\0 |
在 UNICODE 被采用之后,计算机存放字符串时,改为存放每个字符在 UNICODE 字符集中的序号。目前计算机一般使用 2 个字节(16 位)来存放一个序号(DBCS),因此,这种方式存放的字符也被称作宽字节字符。比如,字符串 "中文123" 在 Windows 2000 下,内存中实际存放的是 5 个序号:
2D |
4E |
87 |
65 |
31 |
00 |
32 |
00 |
33 |
00 |
00 |
00 |
← 在 x86 CPU 中,低字节在前 |
|
|
|
|
|
|
|
中 |
文 |
1 |
2 |
3 |
\0 |
|
一共占 10 个字节。
1.2 字符,字节,字符串
理解编码的关键,是要把字符的概念和字节的概念理解准确。这两个概念容易混淆,我们在此做一下区分:
|
概念描述 |
举例 |
字符 |
人们使用的记号,抽象意义上的一个符号。 |
'1', '中', 'a', '$', '¥', …… |
字节 |
计算机中存储数据的单元,一个8位的二进制数,是一个很具体的存储空间。 |
0x01, 0x45, 0xFA, …… |
ANSI 字符串 |
在内存中,如果“字符”是以 ANSI 编码形式存在的,一个字符可能使用一个字节或多个字节来表示,那么我们称这种字符串为 ANSI 字符串或者多字节字符串。 |
"中文123" (占7字节)
|
UNICODE 字符串 |
在内存中,如果“字符”是以在 UNICODE 中的序号存在的,那么我们称这种字符串为 UNICODE 字符串或者宽字节字符串。 |
L"中文123" (占10字节)
|
由于不同 ANSI 编码所规定的标准是不相同的,因此,对于一个给定的多字节字符串,我们必须知道它采用的是哪一种编码规则,才能够知道它包含了哪些“字符”。而对于 UNICODE 字符串来说,不管在什么环境下,它所代表的“字符”内容总是不变的。
分享到:
相关推荐
问题描述:我们项目开发都统一采用utf-8格式编码,但昨天研发部的一个产品要集成进来,他们是用gbk编码的,如果强行将文件设置成utf-8肯定不行,中文全乱了。在jsp里面用 ctrl+H 进行搜索替换也不行,中文也是显示不...
`copyto.php`负责处理转帖请求,如获取当前文章的信息,生成适合其他平台的分享链接或代码,然后将这些信息以可复制的格式返回给用户,让用户可以轻松地将内容分享到社交媒体或其他网站。 在使用过程中,可能会遇到...
1. 责任链模式(Chain of Responsibility):避免将处理逻辑硬编码到对象中,而是让对象组成一条链,请求沿链传递直到被某个对象处理。 2. 命令模式(Command):将请求封装为一个对象,使得可以使用不同的请求、...
第二部分让说了c/s的程序流程,编码部分有一个是树的广度优先遍历,当时一看就懵了,已经不看数据接构好多年了,忽然看了树,反而不知道怎么写了。还有一个是以空格分隔的字符串倒序输出,比如:I am a student,...
暴库是指攻击者利用特定的URL或字符编码技巧,直接访问或下载Web服务器上的数据库文件。一旦成功,攻击者可直接获取数据库中的所有信息,包括用户数据、账号信息等。 ### 数据包监测 数据包监测(Packet Sniffing)...
"交流论坛--漫谈Java中的中文问题[转帖].htm"可能讨论了在ASP中处理中文字符集的问题,尤其是在与Java应用交互时可能出现的编码兼容性问题。 "交流论坛--Java Servlet和JSP教程之三.htm"同样可能是对比分析ASP与...
2. 内容还原:通过算法解析,将识别出的干扰码转化为可读的文字或正常格式的数据。 3. 转贴功能:用户可以方便地复制已解码的内容,并在其他地方(可能是同一论坛的其他帖子,或者是其他论坛)进行粘贴,保持内容的...
用户界面设计了多种播放风格,并具备音量调节、播放进度显示、全屏播放、分类播放列表、推荐、排行榜、专辑管理、标签、收藏、评论、转帖、订阅和留言等社交互动功能。同时,系统还支持视频广告投放,增强了商业化...
本项目编码UTF-8编译版本4.2.2javaapk提供测试。本源码分析文档http://blog.csdn.net/lmj623565791/article/details/38498353 转载请注明本文地址: http://www.javaapk.com/source/7211.html | JavaApk-安卓应用...
这篇文章是关于Rational Unified Process(RUP)的讨论,由“胖子”(可能是作者的昵称)分享的一个转帖。RUP是一种广泛使用的软件开发过程框架,由IBM的Rational公司开发。它是一种迭代和面向组件的软件开发方法论...
5. 编码问题的处理:在处理API返回的数据时,可能会遇到编码不一致的问题,文中提到了使用`iconv`函数进行编码转换(从UTF-8转换为GBK),确保数据的正确显示。 6. 安全和隐私注意事项:使用第三方API接口进行用户...
**aixcoder智能编程助手** 是一款专为程序员设计的高效开发插件,它利用先进的深度学习技术,...同时,如果你觉得这款工具对你有所帮助,也请分享给你的同行朋友,并在转帖时注明出处,让我们共同推动软件开发的进步。
3.修正部分情况一键转帖页面缺少文件的BUG. 4.修正大文件上传个别情况存在的错误. 功能列表: 1.MYDOWN V4默认模板风格更换,全新制作. 2.添加下载中 下载权限设置:后台允许修改: “否 ”“是”的默认值(还有...