中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » 网络日志(Blog) » 国家标准GB18030-2005《信息技术 中文编码字符集》
« [1] [2] [3] [4] [5] [6] »
作者:
标题: 国家标准GB18030-2005《信息技术 中文编码字符集》 上一主题 | 下一主题
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 61 楼』:  

C语言显示USDOS汉字库
http://www.cnblogs.com/hoodlum1980/articles/1079944.html




C语言读取HZK16

/**
* hzk汉字点阵,感谢高金山网友无私分享
*
* 整理:    http://jdgcs.org/
* 技术细节:http://jdgcs.org/HZK16
* jdgcs.org
*/
#include <stdio.h>
#include <stdlib.h>

int main()
{
unsigned char incode[3]="我"; // 要读出的汉字,GB编码
unsigned char qh = 0, wh = 0;
unsigned long offset = 0;
char mat[16][2] = {0};
FILE *HZK = 0;
int i,j,k;

//每个汉字,占两个字节, 取其区位号
qh = incode[0] - 0xa0;        //获得区码
wh = incode[1] - 0xa0;        //获得位码
offset = (94*(qh-1)+(wh-1]]*32; //得到偏移位置
if[[HZK=fopen("hzk16", "rb"]] == NULL)
{
printf("Can't Open hzk16\n");
getchar();
return 0;
}
fseek(HZK, offset, SEEK_SET);
fread(mat, 32, 1, HZK);
fclose(HZK);

//显示
for(i=0; i<16; i++)
{
for(j=0; j<2; j++)
{
for(k=0; k<8; k++)
{
if(mat[j] & (0x80>>k]]
{//测试为1的位则显示
printf("%c",'#');
}
else
{
printf("%c",'-');
}
}
}
printf("\n");
}
getchar();
return 1;
}
{CODE}


{CODE(caption="C语言读取HZK16,参考版",wrap="1",colors="c")}
//hzk汉字点阵,感谢hfhrman网友无私分享
//http://jdgcs.org 整理发布
int    i,j,k;
unsigned    char    incode[3]="我";    //    要读出的汉字
unsigned    char    qh,wh;
unsigned    long    offset;
//    占两个字节,    取其区位号
qh    =    incode[0]    -    0xa0;/ /获得区码
wh    =    incode[1]    -    0xa0;   / /获得位码
offset    =    (94*(qh-1)+(wh-1]]*32;          /    *得到偏移位置*    /

FILE    *HZK;
char    mat[32];
if[[HZK=fopen("hzk16",    "rb"]]    ==    NULL)
{
printf("Can't    Open    hzk16\n");
exit(0);
}
fseek(HZK,    offset,    SEEK_SET);
fread(mat,    32,    1,    HZK);

//显示

for(j=0;j<16;j++)
for(i=0;i<2;i++)
for(k=0;k<8;k++)
if(mat[j]&(0x80>>k]] /*测试为1的位则显示*/
{

printf("%s",'#');

}else{   printf("%s",'-');

}


fclose(HZK);
fclose(fp);

[ Last edited by zzz19760225 on 2016-12-11 at 22:39 ]



1<词>,2[句],3/段\,4{节},5(章)。
2016-6-26 19:55
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 62 楼』:  CMap

https://baike.baidu.com/item/CMap/2334917?fr=aladdin

CMap 编辑
CMap,计算机语言函数,作用是映射的关键码。
外文名 CMap 用    作 映射的关键码 包    括 KEY对象的类 属    于 参数KEY使用的数据类型
目录
1 参数
2 说明
▪ 构造函数
▪ 操作符
▪ 状态
3 CMap用法
参数编辑
KEY对象的类,用作映射的关键码。ARG_KEY参数KEY使用的数据类型,通常为KEY的参考。VALUE存储在映射中对象的类。ARG_VALUE参数VALUE使用的数据类型,通常为VALUE的参考。
说明编辑
CMap是把唯一关键码映射到值的字典收集类。一旦在映射中插入了一个关键码值对(元素),就可以使用这些关键码,有效地获取或删除对。同样,也可以反复使用映射中的所有元素。
POSITION类型变量用于替换所有映射变量的入口。可以使用POSITION来“记忆”入口和映射中的遍历。可能认为这种遍历是通过关键码值来依次进行的,但其实不是。获取元素的次序没有确定。
该类的某些成员函数调用了全局的帮助函数,它们必须定制,以满足CMap类的更多用途。请参阅“Microsoft Visual C++ MFC库参考”中的“宏和全局”部分中的“收集类帮助程序”。
CMap引入了宏IMPLEMENT_SERIAL,支持其元素的串行化和转储。如果映射存储到档案文件中,那么每一元素都可利用加载插入(<<)操作符或Serialize成员函数来依次进行串行化。如果要了解有关在映射中进行个别元素的诊断转储,那么转储内容的深度必须为1或更大。当CMap对象删除或其元素被删除,那么关键码和值都将被删除。映射类的派生与列表的派生相似。
请参阅联机文档“Visual C++程序员指南”中的“收集”部分,以进一步了解特殊用途的列表类的派生。
#include <afxtempl.h>
CMap类的成员
构造函数
CMap构造一个映射关键码为值的收集
操作符
Lookup查找与指定关键码对应的值;SetAt在映射中插入一个元素,但假如发现了相匹配的关键码,则替换已经存在的元素;operator []在映射中插入一个元素,它是代替SetAt的操作符;RemoveKey删除关键码指定的元素;RemoveAll删除映射中所有的元素;GetStartPosition返回第一个元素的位置;GetNextAssoc获取循环中下一个元素;GetHashTableSize返回散列表的大小(元素的个数);InitHashTable初始化散列表,并指定其大小。
状态
GetCount返回映射中元素的个数;IsEmpty测试是否为空映射(即没有元素)。
CMap用法编辑
归根到底,CMap是用CPair来存放数据的,CPair的形式是{KEY, VALUE}。因此CMap实际存放的是KEY,而不是ARG_KEY。但是,如果你查阅MFC的代码,你会发现几乎所有的CMap成员函数的参数都标有ARG_KEY和ARG_VALUE类型,所以,用KEY&来作为ARG_KEY的类型通常是正确的,除非:
1. 你使用原子类型数据类型如int, char,此时值传递和引用传递并没有什么差别(甚至值传递更快)。
2. 如果你用CString作为键(KEY)类型,你应使用LPCTSTR作为ARG_KEY的类型,而不是用CString&,原因我稍后说明。
我如何将CMap用于我自己的类ClassX正如我刚才提到的,CMap是一种Hash Map,Hash Map要求每个元素都要有一个Hash值——一个关于KEY的函数,Hash Map用这个值作为Hash表的索引。如果有多个KEY的Hash值相同,它们将以链表的方式存储。所以,你要做的第一件事就是提供一个Hash函数。
CMap会调用模板函数HashKey()来计算Hash值。
默认的实现以及对于LPCSTR和LPCWSTR的专门实现如下:
// inside <afxtemp.h>
template<class ARG_KEY>
AFX_INLINE UINT AFXAPI HashKey(ARG_KEY key)
...{
// default identity hash - works for most primitive values
return (DWORD)(((DWORD_PTR)key)>>4);
}
// inside <strcore.cpp>
// specialized implementation for LPCWSTR
#if _MSC_VER >= 1100
template<> UINT AFXAPI HashKey<LPCWSTR> (LPCWSTR key)
#else
UINT AFXAPI HashKey(LPCWSTR key)
#endif
...{
UINT nHash = 0;
while (*key)
nHash = (nHash<<5) + nHash + *key++;
return nHash;
}
// specialized implementation for LPCSTR
#if _MSC_VER >= 1100
template<> UINT AFXAPI HashKey<LPCSTR> (LPCSTR key)
#else
UINT AFXAPI HashKey(LPCSTR key)
#endif
...{
UINT nHash = 0;
while (*key)
nHash = (nHash<<5) + nHash + *key++;
return nHash;
}
如你所见,缺省行为会“假定”KEY是一个指针,并将它转换为DWORD类型,这就是为什么当你没有为你的ClassX提供一个专门的HashKey()时你会得到“error C2440: ''type cast'': cannot convert from ''ClassXXX'' to ''DWORD_PTR''”错误的原因。
同时,因为MFC只是实际了LPCSTR和LPCWSTR的专门化,并没有实现CStringA和CStringW的专门化,因此如果你想使用CString作为CMap的键类型,你要声明为CMap<CString, LPCTSTR, ……>。
好了,现在你知道CMap如何计算Hash值了,但是由于可能会有多个键的Hash值相同,CMap需要遍历整个链表来找到要求的数据,而不只是在相同的Hash值中。并且当CMap进行匹配时,会调用CompareElements(),这是另一个模板函数。
// inside <afxtemp.h>
// noted: when called from CMap,
// TYPE=KEY, ARG_TYPE=ARG_TYPE
// and note pElement1 is TYPE*, not TYPE
template<class TYPE, class ARG_TYPE>
BOOL AFXAPI CompareElements(const TYPE* pElement1,
const ARG_TYPE* pElement2)
...{
ASSERT(AfxIsValidAddress(pElement1,
sizeof(TYPE), FALSE));
ASSERT(AfxIsValidAddress(pElement2,
sizeof(ARG_TYPE), FALSE));
// for CMap<CString, LPCTSTR...>
// we are comparing CString == LPCTSTR
return *pElement1 == *pElement2;
}
因此,如果你想让CMap用于你自己的类ClassX,就必须提供HashKey()和CompareElements()的专门化实现。
示例:CMap用于CString*作为一个例子,以下说明了要将CMap用于CString*前你需要做的。当然了,是使用字符串的值作为键(KEY),而不是用指针的地址。
template<>
UINT AFXAPI HashKey<CString*> (CString* key)
...{
return (NULL == key) ? 0 : HashKey((LPCTSTR)(*key));
}
// I don''t know why, but CompareElements can''t work with CString*
// have to define this
typedef CString* LPCString;
template<>
BOOL AFXAPI CompareElements<LPCString, LPCString>
(const LPCString* pElement1, const LPCString* pElement2)
...{
if ( *pElement1 == *pElement2 ) ...{
// true even if pE1==pE2==NULL
return true;
} else if ( NULL != *pElement1 && NULL != *pElement2 ) ...{
// both are not NULL
return **pElement1 == **pElement2;
} else ...{
// either one is NULL
return false;
}
}
Main函数如下:
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
...{
CMap<CString*, CString*, int, int> map;
CString name1 = "Microsoft";
CString name2 = "Microsoft";
map[&name1] = 100;
int x = map[&name2];
printf("%s = %d ", (LPCTSTR)name1, x);*/
return 0;
}
--------- console output ---------
Microsoft = 100
注意即使你没有提供HashKey()和CompareElements()的专门化编译器也不会报错,但这样的话输出为0,或许不是你想要的。
关于CMap的总结CMap是一种Hash Map而STL::map是Tree Map,比较两者的效率是没有意义的(如同比较苹果和桔子!)。但是如果你要按顺序取得关键字,你需要使用STL::map。
HashKey()的设计是效率的关键。你应该提供一个低碰撞(即不同的关键字产生相同的Hash值)率、容易计算(而不是像MD5那样)的HashKey()。我们必须注意这点——至少对于某些类来说——并不是件容易的事。
当使用CMap(以及STL::hash_map)时,注意Hash表的大小。引用一段MSDN的说明:“Hash表的大小应该是一个质数。为了减少碰撞,Hash表的大小应该超出最大预计容量的20%。默认情况下,CMap的Hash表大小为17,这对于10个关键字左右的数据很合适。你可以用InitHashTable(UINT nHashSize)来改变Hash表的大小,并且只能在加入第一个元素之前这样做。你可能在这里找到很多质数。(不要与CMap(UINT nBlockSize)弄混了,nBlockSize用于获得多个CAssoc来加速创建新结点。)

[ Last edited by zzz19760225 on 2017-12-11 at 19:53 ]



1<词>,2[句],3/段\,4{节},5(章)。
2016-6-26 19:56
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 63 楼』:  

最常用的一千个汉字使用频率排名-----作者:钟丽
https://www.thn21.com/base/zi/17300.html

最常用的一千个汉字使用频率排名

汉语常用字只有三千多个,国家标准GB2312-80《信息交换用汉字编码字符集*基本集》就是根据使用频率制订的。

一级字库为常用字,3755个,二级字库为不常用字,3008个,一、二级字库共有汉字6763个。

一级字库的字,使用频率合计达99.7%。即在现代汉语材料中的每一万个汉字中,这些字就会出现9970次以上,其余的所有汉字也不足30次。而最常用的1000个汉字,使用频率在90%以上.

使用频率排名前5个汉字(使用频率之和为10%):

的 一 是 了 我

使用频率排名第(6~17)个汉字(使用频率之和为10%):

不 人 在 他 有 这 个 上 们 来 到 时

使用频率排名第(18~42)个汉字(使用频率之和为10%):

大 地 为 子 中 你 说 生 国 年 着 就 那 和 要 她 出 也 得 里 后 自 以 会

使用频率排名第(43~79)个汉字(使用频率之和为10%):

家 可 下 而 过 天 去 能 对 小 多 然 于 心 学 么 之 都 好 看 起 发 当 没 成 只 如 事 把 还 用 第 样 道 想 作 种 开 (这36个汉字的使用频率之和为10%)

使用频率排名第(80~140)个汉字(使用频率之和为10%):

美 总 从 无 情 己 面 最 女 但 现 前 些 所 同 日 手 又 行 意 动 方 期 它 头 经 长 儿 回 位 分 爱 老 因 很 给 名 法 间 斯 知 世 什 两 次 使 身 者 被 高 已 亲 其 进 此 话 常 与 活 正 感

使用频率排名141-232的汉字(这92个汉字的频率之和为10%)

见 明 问 力 理 尔 点 文 几 定 本 公 特 做 外 孩 相 西 果 走 将 月 十 实 向 声 车 全 信 重 三 机 工 物 气 每 并 别 真 打 太 新 比 才 便 夫 再 书 部 水 像 眼 等 体 却 加 电 主 界 门 利 海 受 听 表 德 少 克 代 员 许 稜 先 口 由 死 安 写 性 马 光 白 或 住 难 望 教 命 花 结 乐 色

使用频率排名233-380的汉字(148个汉字,使用频率之和10%)

更 拉 东 神 记 处 让 母 父 应 直 字 场 平 报 友 关 放 至 张 认 接 告 入 笑 内 英 军 候 民 岁 往 何 度 山 觉 路 带 万 男 边 风 解 叫 任 金 快 原 吃 妈 变 通 师 立 象 数 四 失 满 战 远 格 士 音 轻 目 条 呢 病 始 达 深 完 今 提 求 清 王 化 空 业 思 切 怎 非 找 片 罗 钱 紶 吗 语 元 喜 曾 离 飞 科 言 干 流 欢 约 各 即 指 合 反 题 必 该 论 交 终 林 请 医 晚 制 球 决 窢 传 画 保 读 运 及 则 房 早 院 量 苦 火 布 品 近 坐 产 答 星 精 视 五 连 司 巴

382-500 (5.43%)

奇 管 类 未 朋 且 婚 台 夜 青 北 队 久 乎 越 观 落 尽 形 影 红 爸 百 令 周 吧 识 步 希 亚 术 留 市 半 热 送 兴 造 谈 容 极 随 演 收 首 根 讲 整 式 取 照 办 强 石 古 华 諣 拿 计 您 装 似 足 双 妻 尼 转 诉 米 称 丽 客 南 领 节 衣 站 黑 刻 统 断 福 城 故 历 惊 脸 选 包 紧 争 另 建 维 绝 树 系 伤 示 愿 持 千 史 谁 准 联 妇 纪 基 买 志 静 阿 诗 独 复 痛 消 社 算

501-631

算 义 竟 确 酒 需 单 治 卡 幸 兰 念 举 仅 钟 怕 共 毛 句 息 功 官 待 究 跟 穿 室 易 游 程 号 居 考 突 皮 哪 费 倒 价 图 具 刚 脑 永 歌 响 商 礼 细 专 黄 块 脚 味 灵 改 据 般 破 引 食 仍 存 众 注 笔 甚 某 沉 血 备 习 校 默 务 土 微 娘 须 试 怀 料 调 广 蜖 苏 显 赛 查 密 议 底 列 富 梦 错 座 参 八 除 跑 亮 假 印 设 线 温 虽 掉 京 初 养 香 停 际 致 阳 纸 李 纳 验 助 激 够 严 证 帝 饭 忘 趣 支

632-1000

春 集 丈 木 研 班 普 导 顿 睡 展 跳 获 艺 六 波 察 群 皇 段 急 庭 创 区 奥 器 谢 弟 店 否 害 草 排 背 止 组 州 朝 封 睛 板 角 况 曲 馆 育 忙 质 河 续 哥 呼 若 推 境 遇 雨 标 姐 充 围 案 伦 护 冷 警 贝 著 雪 索 剧 啊 船 险 烟 依 斗 值 帮 汉 慢 佛 肯 闻 唱 沙 局 伯 族 低 玩 资 屋 击 速 顾 泪 洲 团 圣 旁 堂 兵 七 露 园 牛 哭 旅 街 劳 型 烈 姑 陈 莫 鱼 异 抱 宝 权 鲁 简 态 级 票 怪 寻 杀 律 胜 份 汽 右 洋 范 床 舞 秘 午 登 楼 贵 吸 责 例 追 较 职 属 渐 左 录 丝 牙 党 继 托 赶 章 智 冲 叶 胡 吉 卖 坚 喝 肉 遗 救 修 松 临 藏 担 戏 善 卫 药 悲 敢 靠 伊 村 戴 词 森 耳 差 短 祖 云 规 窗 散 迷 油 旧 适 乡 架 恩 投 弹 铁 博 雷 府 压 超 负 勒 杂 醒 洗 采 毫 嘴 毕 九 冰 既 状 乱 景 席 珍 童 顶 派 素 脱 农 疑 练 野 按 犯 拍 征 坏 骨 余 承 置 臓 彩 灯 巨 琴 免 环 姆 暗 换 技 翻 束 增 忍 餐 洛 塞 缺 忆 判 欧 层 付 阵 玛 批 岛 项 狗 休 懂 武 革 良 恶 恋 委 拥 娜 妙 探 呀 营 退 摇 弄 桌 熟 诺 宣 银 势 奖 宫 忽 套 康 供 优 课 鸟 喊 降 夏 困 刘 罪 亡 鞋 健 模 败 伴 守 挥 鲜 财 孤 枪 禁 恐 伙 杰 迹 妹 藸 遍 盖 副 坦 牌 江 顺 秋 萨 菜 划 授 归 浪 听 凡 预 奶 雄 升 碃 编 典 袋 莱 含 盛 济 蒙 棋 端 腿 招 释 介 烧 误

根据国家出版局抽样统计,汉字中最常用字560个,常用字807个,次常用字1033个。三者合计2400个,占一般书刊用字的99%,所以小学生如果认识2400个常用字就能阅读一般书刊。

[ Last edited by zzz19760225 on 2018-3-21 at 22:30 ]



1<词>,2[句],3/段\,4{节},5(章)。
2016-6-26 19:56
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 64 楼』:  

1



1<词>,2[句],3/段\,4{节},5(章)。
2016-6-26 19:57
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 65 楼』:  

1



1<词>,2[句],3/段\,4{节},5(章)。
2016-6-26 19:58
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 66 楼』:  

1



1<词>,2[句],3/段\,4{节},5(章)。
2016-6-26 19:59
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 67 楼』:  

1



1<词>,2[句],3/段\,4{节},5(章)。
2016-6-26 20:00
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 68 楼』:  

1



1<词>,2[句],3/段\,4{节},5(章)。
2016-6-26 20:00
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 69 楼』:  

1



1<词>,2[句],3/段\,4{节},5(章)。
2016-6-26 20:01
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 70 楼』:  

1



1<词>,2[句],3/段\,4{节},5(章)。
2016-6-26 20:05
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 71 楼』:  

1



1<词>,2[句],3/段\,4{节},5(章)。
2016-6-26 20:07
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 72 楼』:  

1



1<词>,2[句],3/段\,4{节},5(章)。
2016-6-26 20:08
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 73 楼』:  

1



1<词>,2[句],3/段\,4{节},5(章)。
2016-6-26 20:09
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 74 楼』:  

1



1<词>,2[句],3/段\,4{节},5(章)。
2016-6-26 20:09
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 75 楼』:  

作者:于洋
链接:https://www.zhihu.com/question/23374078/answer/69732605
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物。他们看到8个开关状态是好的,于是他们把这称为”字节“。再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去。他们看到这样是好的,于是它们就这机器称为”计算机“。

开始计算机只在美国用。八位的字节一共可以组合出256(2的8次方)种不同的状态。 他们把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端、打印机遇上约定好的这些字节被传过来时,就要做一些约定的动作:遇上0×10, 终端就换行;遇上0×07, 终端就向人们嘟嘟叫;遇上0x1b, 打印机就打印反白的字,或者终端就用彩色显示字母。他们看到这样很好,于是就把这些0×20以下的字节状态称为”控制码”。他们又把所有的空 格、标点符号、数字、大小写字母分别用连续的字节状态表示,一直编到了第127号,这样计算机就可以用不同字节来存储英语的文字了。大家看到这样,都感觉 很好,于是大家都把这个方案叫做 ANSI 的”Ascii”编码(American Standard Code for Information Interchange,美国信息互换标准代码)。当时世界上所有的计算机都用同样的ASCII方案来保存英文文字。

后来,就像建造巴比伦塔一样,世界各地都开始使用计算机,但是很多国家用的不是英文,他们的字母里有许多是ASCII里没有的,为了可以在计算机保存他们的文字,他们决定采用 127号之后的空位来表示这些新的字母、符号,还加入了很多画表格时需要用下到的横线、竖线、交叉等形状,一直把序号编到了最后一个状态255。从128 到255这一页的字符集被称”扩展字符集“。从此之后,贪婪的人类再没有新的状态可以用了,美帝国主义可能没有想到还有第三世界国家的人们也希望可以用到计算机吧!

等中国人们得到计算机时,已经没有可以利用的字节状态来表示汉字,况且有6000多个常用汉字需要保存呢。但是这难不倒智慧的中国人民,我们不客气地把那些127号之后的奇异符号们直接取消掉, 规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,我们还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的”全角”字符,而原来在127号以下的那些就叫”半角”字符了。中国人民看到这样很不错,于是就把这种汉字方案叫做 “GB2312“。GB2312 是对 ASCII 的中文扩展。

因为当时各个国家都像中国这样搞出一套自己的编码标准,结果互相之间谁也不懂谁的编码,谁也不支持别人的编码,连大陆和台湾这样只相隔了150海里,使用着同一种语言的兄弟地区,也分别采用了不同的 DBCS 编码方案——当时的中国人想让电脑显示汉字,就必须装上一个”汉字系统”,专门用来处理汉字的显示、输入的问题,像是那个台湾的愚昧封建人士写的算命程序就必须加装另一套支持 BIG5 编码的什么”倚天汉字系统”才可以用,装错了字符系统,显示就会乱了套!这怎么办?而且世界民族之林中还有那些一时用不上电脑的穷苦人民,他们的文字又怎么办? 真是计算机的巴比伦塔命题啊!

正在这时,大天使加百列及时出现了——一个叫 ISO(国际标谁化组织)的国际组织决定着手解决这个问题。他们采用的方法很简单:废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号 的编码!他们打算叫它”Universal Multiple-Octet Coded Character Set”,简称 UCS, 俗称 “unicode“。

unicode开始制订时,计算机的存储器容量极大地发展了,空间再也不成为问题了。于是 ISO 就直接规定必须用两个字节,也就是16位来统一表示所有的字符,对于ASCII里的那些“半角”字符,unicode包持其原编码不变,只是将其长度由原来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码。由于”半角”英文符号只需要用到低8位,所以其高8位永远是0,因此这种大气的方案在保存英文文本时会多浪费一倍的空间。

这时候,从旧社会里走过来的程序员开始发现一个奇怪的现象:他们的 strlen 函数靠不住了,一个汉字不再是相当于两个字符了,而是一个!是的,从unicode开始,无论是半角的英文字母,还是全角的汉字,它们都是统一的”一个字符“!同时,也都是统一的”两个字节“,请注意”字符”和”字节”两个术语的不同,“字节”是一个8位的物理存贮单元,而“字符”则是一个文化相关的符号。在unicode中,一个字符就是两个字节。一个汉字算两个英文字符的时代已经快过去了。

unicode同样也不完美,这里就有两个的问题,一个是,如何才能区别unicode和ascii?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储空间来说是极大的浪费,文本文件的大小会因此大出二三倍,这是难以接受的。

unicode在很长一段时间内无法推广,直到互联网的出现,为解决unicode如何在网络上传输的问题,于是面向传输的众多 UTF(UCS Transfer Format)标准出现了,顾名思义,UTF-8就是每次8个位传输数据,而UTF-16就是每次16个位。UTF-8就是在互联网上使用最广的一种unicode的实现方式,这是为传输而设计的编码,并使编码无国界,这样就可以显示全世界上所有文化的字符了。UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,注意的是unicode一个中文字符占2个字节,而UTF-8一个中文字符占3个字节)。从unicode到utf-8并不是直接的对应,而是要过一些算法和规则来转换。

Unicode符号范围         |   UTF-8编码方式
(十六进制)                 |  (二进制)—————————————————————–
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx


最后简单总结一下:
      中国人民通过对 ASCII 编码的中文扩充改造,产生了 GB2312 编码,可以表示6000多个常用汉字。
      汉字实在是太多了,包括繁体和各种字符,于是产生了 GBK 编码,它包括了 GB2312 中的编码,同时扩充了很多。
      中国是个多民族国家,各个民族几乎都有自己独立的语言系统,为了表示那些字符,继续把 GBK 编码扩充为 GB18030 编码。
      每个国家都像中国一样,把自己的语言编码,于是出现了各种各样的编码,如果你不安装相应的编码,就无法解释相应编码想表达的内容。
      终于,有个叫 ISO 的组织看不下去了。他们一起创造了一种编码 UNICODE ,这种编码非常大,大到可以容纳世界上任何一个文字和标志。所以只要电脑上有 UNICODE 这种编码系统,无论是全球哪种文字,只需要保存文件的时候,保存成 UNICODE 编码就可以被其他电脑正常解释。
      UNICODE 在网络传输中,出现了两个标准 UTF-8 和 UTF-16,分别每次传输 8个位和 16个位。于是就会有人产生疑问,UTF-8 既然能保存那么多文字、符号,为什么国内还有这么多使用 GBK 等编码的人?因为 UTF-8 等编码体积比较大,占电脑空间比较多,如果面向的使用人群绝大部分都是中国人,用 GBK 等编码也可以。


https://www.zhihu.com/question/23374078
https://wenku.baidu.com/view/cb9fe505cc17552707220865.html

[ Last edited by zzz19760225 on 2018-2-16 at 18:10 ]



1<词>,2[句],3/段\,4{节},5(章)。
2016-6-26 20:10
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] [4] [5] [6] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: