锁定老帖子 主题:说说字符集、编码概念
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-01-17
最后修改:2009-01-17
要谈编码就要先谈两个十分容易混淆的概念,一个是编码字符集 (Coded Character Set),一个是字符编码方案 (Character Encoding Scheme)。
编码字符集就是将字符集中每个字符赋一个数字代码 ,这是为了便于计算机处理。编码字符集一般由标准组织制定,Unicode就是典型的编码字符集。一个编码字符集必定对应一个字符集,Unicode编码字符集对应Unicode字符集,那么什么是字符集呢?
字符编码方案定义如何将数字代码映射成字节序列 。有人可能就要问了,有必要这么麻烦吗,代码1不就映射成字节1,代码2不就映射成字节2,依次类推。的确如果,字符集的不超过256个字符,这是一种非常合理简单的编码方案,每个字符只用一个字节来表示就可以了。但是如果字符集大小超过256个且不超过65536个,每个字符就需要2字节来编码,如果字符集包含更多的字符就需要使用更多的字节来编码一个字符,这种编码方案称为定长编码 ,例如GB2312就是采用这样的编码方案。这种编码方案很简单但是却存在问题,它对常用的和生癖的字符都使用同样的长度来编码,这很浪费存储空间,一种更好的编码方案是使用变长编码 ,它对常用的字符使用一个字节来编码,对不常用的字符使用两个字节来编码,而对非常生癖的字符使用三个或更多的字节来编码。Unicode编码字符集的一种变长编码方案是就是UTF-8,它的定长编码方案称为UTF-16。需要注意的是,既然涉及到多个字节就需要注意字节序了,因此UTF-16又分为Big Endian UTF-16和Little Endian UTF-16。UTF-8只能有一种字节序,这是因为字符编码之后的字节之间存在依赖关系。
最后什么是编码呢?编码是编码字符集和字符编码方案的一个组合 ,它可以将字符集中的字符映射成字节序列。编码隐含着编码字符集和字符编码方案,从而也隐含着字符集。例如UTF-8是一种编码,它是Unicode编码字符集和UTF8编码方案的一个组合。GB2312也是一种编码,它的编码字符集就是编码的简体中文字符集,编码方案采用定长编码。实践中经常混用编码字符集和编码这两个概念,这是因为大多数编码字符集都只有一种编码方案,这样的编码字符集(或者说编码)包括GB2312, GBK, ASCII, ISO8859-1等。但是当编码字符集存在多种编码方案时,就有必要区分编码字符集和编码了,例如我们说Unicode时一般是指编码字符集,说UTF-8,UTF-16时才是指编码。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-01-17
这些概念估计学习的人更迷糊了。 哈哈, 其实可以说的更简单点:字符集 & 字符集计算机实现. 如果要更深入点, 可以说说不同字符集之间, 基础的字符如何兼容的。
|
|
返回顶楼 | |
发表时间:2009-01-17
我想听有人讲讲java里面的那些编码集相关的api在你所说的这些概念中都扮演一些什么角色,好进一步了解java编码
|
|
返回顶楼 | |
发表时间:2009-01-20
非常好的文章,以前很糊涂,现在总算有些明白了
|
|
返回顶楼 | |
发表时间:2009-02-01
unsid 写道 我想听有人讲讲java里面的那些编码集相关的api在你所说的这些概念中都扮演一些什么角色,好进一步了解java编码 Java API中没有和“编码字符集”及“字符编码方案”对应的API,只有对应“编码”的API,叫做java.nio.charset.Charset,我想它之所以没有将它命名为"Encoding"是因为Encoding可能代表一个动词。在一般的程序中很少需要使用到这个,需要接受Charset的方法一般也存在一个重载方法它接受字符串参数,代表编码的名称。 |
|
返回顶楼 | |
发表时间:2009-03-22
收藏了~~
|
|
返回顶楼 | |
发表时间:2009-03-22
编码就是 索引键,索引键对应了字符
字符集就是 一张键值表 不同的字符集会有不同的索引键派分方式 例如 1 在 A 字符集内对应了 a 1 在 B 字符集内对应了 b 如果用A字符集写入,读取时却说它是B字符集那么应该显示成a的东西就变成了b。 如果 1 在 B 字符集内是“乱码”,那么这个时候应该显示成a的东西就变成“乱码”了。 |
|
返回顶楼 | |
浏览 6823 次