汉字与区位码互转(天天使用Delphi的String存储的是内码,Windows记事本存储的文件也是内码),几个常见汉字的各种编码,utf8与unicode的编码在线查询,附有读书笔记 good
汉=BABA(内码)=-A0A0=2626(区位码)
字=D7D6(内码)=-A0A0=5554(区位码)
各种编码查询表:http://bm.kdd.cc/
汉(记住它,以后碰到内存里的数值,就会有敏感性了,会方便测试)
utf8 = E6 B1 89
unicode = 6C 49 ,在Delphi2010的dfm里存储的是它的十进制 27721
GBK = BA BA
吴
utf8 = E5 90 B4
unicode = 54 34 ,在Delphi的dfm里存储的是它的十进制 21556
GBK = CE E2
“啊”字是GB2312之中的第一个汉字,会以两个字节,0xB0(第一个字节)0xA1(第二个字节)储存(后面会以这个字来解释理论)。
汉=BABA=47802
字=D7D6=55254
中=D6D0=54992
文=CEC4=52932
华=BBAA=48042
夏=CFC4=53188
吴=CEE2=52962
A=65
€=128
À=192
æ=230
GBK里特有的字:
在GB 2312-80推出以后才简化的汉字(如“啰”)
部分人名用字(如中国前总理朱镕基的“镕”字)
GBK3扩充区的第一个汉字“丂”的ANSI编码是8140H,这一点是经过理论和实践双验证的。
GBK的存储方式是大头存储,但Unicode是小头存储,参考:
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
----------------------------------------------------------------------------------------------
//汉字转区位码
function Str2GB(const S: AnsiString): string;
const G = 160; // 160 = hA0
var n, m: word;
begin
n := Ord(S[1]);
m := Ord(S[2]);
Result := FormatFloat('00', n-G) + FormatFloat('00', m-G);
end;
//区位码转汉字
function GB2Str(const n: Word): string;
const G = 160;
begin //前2位数 //后2位数
Result := string(AnsiChar(n div 100 + G) + AnsiChar(n mod 100 + G));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(GB2Str(StrToInt(Edit1.Text)));
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ShowMessage(Str2GB(AnsiString(Edit2.Text)));
end;
----------------------------------------------------------------------------------------------
特别注意,这是D7-XE7都可以使用的程序。因为ANSI与Unicode的区别仅仅在于,ANSI英文表示是一个字符,Unicode的英文是两个字符。但ANSI和Unicode处理中文的时候,都是两个字符,且两者内容完全一致。这么说ANSI与Unicode对汉字的处理几乎没有区别,区别在于对英文字符的处理,并且Unicode下还能处理除了中文以外的语言的特殊字符(比如俄文字符)。另外各个不同的ANSI编码之间那就真的是完全不同、鸡对鸭讲了。
===================================================
总结:这说明平时天天用到Delphi的String,存储的是汉字的内码(不是区位码)。理论解释:汉字机内码,又称“汉字ASCII码”,简称“内码”,指计算机内部存储,处理加工和传输汉字时所用的由0和1符号组成的代码。输入码被接受后就由汉字操作系统的“输入码转换模块”转换为机内码,与所采用的键盘输入法无关。机内码是汉字最基本的编码,不管是什么汉字系统和汉字输入方法,输入的汉字外码到机器内部都要转换成机内码,才能被存储和进行各种处理。
前面是使用的是“内码”和“区位码”,其实还有一个“国际码”,关系如下:
内码(Delphi的String使用的编码)= 国标码(国家定义)+8080H(其实就是强行添加最高位,使最高位为1)= 区位码(国家定义的基础表格)+A0A0H(比国标码多加了2020H,可以使用Windows自带的区位码输入法测试输入)
出现最高位的原因是:
汉字处理系统要保证中西文的兼容,当系统中同时存在ASCII码和汉字国标码时,将会产生二义性。例如:有两个字节的内容为30H和21H,它既可表示汉字“啊”的国标码,又可表示西文“0”和“!”的ASCII码。为此,汉字机内码应对国标码加以适当处理和变换。国标码的内码为二字节长的代码,它是在相应国标码的每个字节最高位上加“1”。
出现国标码的原因是:
GB2312-80 GB2312将代码表分为94个区,对应第一字节;每个区94个位,对应第二字节,两个字节的值分别为区号值和位号值加32(20H),因此也称为区位码。(读书笔记:94=5EH,这个值远小于128,因此加上20H等于7EH=126,因此再做变换没关系。而且我查了具体的Word文件,最后一项编码就是5E,而不是5F,这只能说GB2312定义的字符太少了,没有充分利用所有的空间。而且我特别注意到,每一个区的最后一行的低位F位置,确实没有定义任何汉字。问题,为什么要做变换?回答:查完基础表以后,再加上2020H就是国标码,政府就是这么规定的,没什么理由。为了方便和快速处理,实际编程使用最方便计算机标识的编码——内码,来使用,就可以直接标识是否汉字。区位码和国标码只是一种理论解释和定义,对程序员来说其实没什么用的。)
国标码是汉字信息交换的标准编码,但因其前后字节的最高位为0,与ASCII码发生冲突(读书笔记:国标码定义有道理,但不实用。另外我查了一下网上的GB2312的Word文件,第一个字符就是A1A1,即已经加好了A0A0的内码,这样虽然对程序员更实用,但这个表格其实已经是被加工过的,而不是国家最初定义的从零开始的基础表格),如“保”?字,国标码为31H和23H,而西文字符“1”和“#”的ASCII也为31H和23H,现假如内存中有两个字节为31H和23H,这到底是一个汉字?,还是两个西文字符“1”和“#”于是就出现了二义性,显然,国标码是不可能在计算机内部直接采用的,于是,汉字的机内码采用变形国标码。
其变换方法为:将国标码的每个字节都加上128,即将两个字节的最高位由0改1,其余7位不变,如:由上面我们知道,“保”字的国标码为3123H,前字节为00110001B,后字节为00100011B,高位改1为10110001B和10100011B 即为B1A3H,因此,汉字的机内码就是B1A3H。
参考:
http://baike.baidu.com/view/1199269.htm
http://baike.baidu.com/view/990066.htm
举例来说,“啊”字是GB2312之中的第一个汉字,它的区位码就是1601。
例如“啊”字在大多数程序中,会以两个字节,0xB0(第一个字节)0xA1(第二个字节)储存。(与区位码对比:0xB0=0xA0+16,0xA1=0xA0+1)。
---------------------------------------------------------------------------
下一个问题:测试一下QT存储的是什么码?我猜是内码的Unicode标识。因此QT字符串与Unicode版Delphi字符串应该兼容的(Delphi字符串头部在负方向,QT看不到)
---------------------------------------------------------------------------
字符转换成UTF8:
https://mothereff.in/utf-8
字符转换成Unicode:
http://www.online-toolz.com/tools/text-unicode-entities-convertor.php
GBK编码列表
http://ff.163.com/newflyff/gbk-list/
汉字与区位码互转(天天使用Delphi的String存储的是内码,Windows记事本存储的文件也是内码),几个常见汉字的各种编码,utf8与unicode的编码在线查询,附有读书笔记 good的更多相关文章
- 汉字与区位码互转(天天使用的String存储的是内码),几个常见汉字编码,附有读书笔记
汉=BABA(内码)=-A0A0=2626(区位码)字=D7D6(内码)=-A0A0=5554(区位码) 各种编码查询表:http://bm.kdd.cc/ “啊”字是GB2312之中的第一个汉字,会 ...
- Python中GBK, UTF-8和Unicode的编码问题
编码问题,一直是使用python2时的一块心病.几乎所有的控制台输入输出.IO操作和HTTP操作都会涉及如下的编码问题: UnicodeDecodeError:‘ascii’codec can’t d ...
- 《T-SQL查询》读书笔记Part 3.索引的基本知识
索引优化是查询优化中最重要的一部分,索引是一种用于排序和搜索的结构,在查找数据时索引可以减少对I/O的需要:当计划中的某些元素需要或是可以利用经过排序的数据时,也会减少对排序的需要.某些方面的优化可以 ...
- 《T-SQL查询》读书笔记Part 2.执行计划
一.关于执行计划 执行计划是优化器生成的用于确定如何处理一个给定查询的“工作计划”.一个计划包含一组运算符,通常按照特定的顺序来应用这些运算符.此外,一些运算符可以在它们之前的运算符还在处理时被应用( ...
- 《T-SQL查询》读书笔记Part 1.逻辑查询处理知多少
一.关于T-SQL T-SQL是ANSI和ISO SQL标准的MS SQL扩展,其正式名称为Transact-SQL,但一般程序员都称其为T-SQL. 二.逻辑查询处理各个阶段 2.1 逻辑查询处理流 ...
- 读书笔记——《在线》
* 2017年10月24日 星期二 晴* ## "在线"是未来世界发展的关键.一个事物是不是符合未来发展的趋势,就是要看它是否在线. 插图 **在线** 正文 作者是王坚,阿里巴巴 ...
- python入门:UTF-8转换成GBK编码
#!/usr/bin/env python # -*- coding:utf-8 -*- #UTF-8转换成GBK编码 #temp(临时雇员,译音:泰坡) #decode(编码,译音:迪口德) #en ...
- 《Linux/Unix系统编程手册》读书笔记 目录
<Linux/Unix系统编程手册>读书笔记1 (创建于4月3日,最后更新4月7日) <Linux/Unix系统编程手册>读书笔记2 (创建于4月9日,最后更新4月10日) ...
- USENIX 最佳论文奖:擦除 Windows Azure 存储编码
我们发表了一篇介绍Windows Azure 存储如何用编码方式擦除数据的论文,此论文在 2012 年 6 月的 USENIX 技术年会上荣获最佳论文奖.这是 MicrosoftResearch ...
随机推荐
- VirtualBox 下主机与虚拟机以及虚拟机之间互通信配置
引用链接:1)http://www.it165.net/os/html/201401/7063.html 2)http://www.cnblogs.com/sineatos/p/4489620.htm ...
- N皇后-位运算优化
N皇后问题 时间限制: 5 Sec 内存限制: 128 MB 题目描述 魔法世界历史上曾经出现过一个伟大的罗马共和时期,出于权力平衡的目的,当时的政治理论家波利比奥斯指出:“事涉每个人的权利,绝不应 ...
- Java面试题集(一)
作为一名java开发软件工程,一定要记住,基础非常重要,往往就是一些基础,很简单,但是你就是不知道实现原理,为什么使用,有没有自己去发现,对比,差异从而总结,有些东西看似简单,但是不一定你描述清楚,直 ...
- SQLite数据库相关操作
一.创建数据库 这里创建了note便签数据表,字段有noteId.noteTitle.noteTime.noteInfo ); // TODO Auto-generated constructor ...
- Python入门--10--序列
一.与列表.元祖的相同与不同 1.都可以通索引得到元素 2.默认索引从0开始 3.可以通过分片得到一个范围内的元素集合 4.有很多共同的操作符 二. 1.list()这个函数用法 a="we ...
- 最短路中部分点只能从中任意选取K个问题
题意:给N个点,还有另外m个点(其中只能选K个),求最短路. 思路:在SPFA的基础上,用一个数组来统计,在某点入队时(要拓展其他点了),若该点是m个点中的,则count[i]=原来的+1:若不是,则 ...
- 安装ubuntu 12.04 后遇到的问题
我的笔记本是08年的戴尔,比较老的机子了.给本本安装ubuntu/windows8双系统后,ubuntu系统中出现了一些问题,在网上搜寻许多解决方法,管用的就分享一下,顺便做一下记录,免得下次自己又不 ...
- 洛谷——P1746 离开中山路
P1746 离开中山路 题目背景 <爱与愁的故事第三弹·shopping>最终章. 题目描述 爱与愁大神买完东西后,打算坐车离开中山路.现在爱与愁大神在x1,y1处,车站在x2,y2处.现 ...
- winform客户端程序实时读写app.config文件
新接到需求,wcf客户端程序运行时,能实时修改程序的打印机名称: 使用XmlHelper读写 winform.exe.config文件修改后始终,不能实时读取出来,查询博客园,原来已有大神解释了: 获 ...
- Linux常用C函数-接口处理篇(网络通信函数)
接口处理篇accept,bind,connect,endprotoent,endservent,getsockopt,htonl,htons,inet_addr,inet_aton,inet_ntoa ...