区位码,国标码,内码之间的区别与联系,以及如何转换

区位码:
在 GB2312 时提出的, GB2312 是一个 94*94 的二维表, 行就是 "区"、列就是 "位", 譬如 "万" 字在 45 区 82 位, 所以 "万" 字的区位码是: 45 82.

00-09 区(682个): 是符号、数字、英文字符...制表符等;
10-15 区: 空白, 留待扩展;
16-55 区(3755个): 常用汉字(也有叫一级汉字), 按拼音排序;
56-87 区(3008个): 非常用汉字(也有叫二级汉字), 这是按部首排序的;
88-94 区: 空白, 留待扩展.

国际码:
咱们的 GB2312 用一个二维表表示了咱们需要的字符,其他文字可能也是如此。为了区别, 所以有国际组织规定把咱们的 "区" 和 "位" 分别加上32(十六进制表示: $20; 二进制表示: 00100000) 作为国际码(那其他文字应该加另外一个不同的数字)。
这样我们可以算出(45+32, 82+32):
"万" 字的国际码是 77 114($4D72)

77 = 0111 0111
114 = 0111 0010

77和114这两个字节还是以0开头,所以还是不能用于ANSI编码里,否则很难分清你到底是要一个“万”字,还是要M和r这两个英文字符。

内码:
不过这还不能在计算机上使用,因为这样会和早已通用的 ASCII 码混淆(导致乱码)。譬如: 77 是 ASCII 的 "M", 114 是 ASCII 的 "r"。所以又有规定把每个字节的最高位都从 0 换成 1(这之前它们都是 0),或者说把每个字节(区和位)都再加上 128(十六进制的: $80;), 从而得到 "机内码", 也就是前面所说的 "内码"。

77 + 128 = 205 = CD
114+ 128 = 242 = F2

打开记事本输入 "万" 字,保存(编码选择 ANSI); 然后用二进制编辑器(譬如: UltraEdit) 打开, 会看到: CD F2, 这就是 "万" 字的内码! (当然,已经在计算机里处理了,以最实用的标准为准;而之前两种编码都只是理论上的标准)



总结一下: 从区位码(国家标准定义) ---> 区和位分别 +32 得到国际码(不再国际混淆)---> 再分别 +128 得到内码(与ACSII也不再混淆); 区位码的区和位分别 +160 即可得到内码。用十六进制表示: 区位码 + $A0A0 = 内码。

内码输入法状态下:可以同时用区位码和内码输出,但不能用国标码输出!



{查汉字区位码}
function Str2GB(const s: AnsiString): string;
const
G = 160;
begin
Result := Format('%d%d', [Ord(s[1])-G, Ord(s[2])-G]);
end;

{通过区位码查汉字}
function GB2Str(const n: Word): string;
const
G = 160;
begin
Result := string(AnsiChar(n div 100 + G) + AnsiChar(n mod 100 + G));
end;


{测试}
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(GB2Str(4582)); {万}
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ShowMessage(Str2GB('万')); {4582}
end;

end.

获取区位码表: 准备个 Memo 接收(注意使用了上面的函数)

var
i,j: Byte;
s: string;
begin
s := '';
for i := 1 to 94 do
begin
for j := 1 to 94 do
s := Format('%s %s', [s, GB2Str(i*100 + j)]);
Memo1.Lines.Add(s);
s := '';
end;
end;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值