Board logo

标题: [问题求助] 内码转换的原理?(已解决) [打印本页]

作者: wankoilz    时间: 2011-12-1 09:08     标题: 内码转换的原理?(已解决)

本帖最后由 wankoilz 于 2011-12-2 21:31 编辑

百度了半天也没查出个所以然来...
我想问内码转换的原理?
比如把GB2312的“人”字转成UTF8,是直接将前者的内码通过公式换算成UTF8的相应内码吗(公式法)?
又或者说通过“人”字的字形码之类的为中介去查Unicode表(中介查表法)?
望高人指点!
作者: Demon    时间: 2011-12-1 10:49

没有算法,只能查表
作者: wankoilz    时间: 2011-12-1 11:44

回复 2# Demon


    感谢回复,请问知不知道具体是通过哪种“码”为中介?(始终需要一个中介吧)
作者: powerbat    时间: 2011-12-1 12:49

非要说成“中介”的话,就是得到字符的Unicode码,再根据utf-8的编码原理(公式)进行转换。
作者: wankoilz    时间: 2011-12-1 19:09

本帖最后由 wankoilz 于 2011-12-1 19:10 编辑

回复 4# powerbat


感谢回复!   
那在查unicode表的时候是用什么查的呢?至少要“人”字的字形去查表吧,总不可能拿GB2312码去查unicode表啊...
作者: Demon    时间: 2011-12-1 21:08

你知道ChrW函数么?

http://demon.tw/programming/asc- ... hrw-difference.html
作者: wankoilz    时间: 2011-12-1 22:24

本帖最后由 wankoilz 于 2011-12-2 02:26 编辑

感谢楼上,这个东西我用过的。
我想了解的不是如何用程序来实现编码转换,这个不难。
好吧,我们知道,ANSI(GB2312) 中每个字符都在UNICODE表中有唯一的一个映射,
如果说存在这样一个供内码转换的表:
1-a 2-b 3-c
4-d 5-e 6-f
...(其中数字代表ANSI码,字母代表UNICODE)
那么在知道ANSI码的时候自然可以查表得到相应的UNICODE码。
否则,我们在知道 "1"  的时候怎么能知道它对应的UNICODE码是什么呢?
电脑不是人脑,它不能像人一样在ANSI码表中“看”到“人”这个字的时候去UNICODE表中找到相应的UNICODE码。它看到的只有二进制...要实现这个过程我想是:
“人”的ANSI码 —“人”的字形码—通过“人”字形码查表得到相应的UNICODE码
不知道事实上是不是这样的,还请指点。

PS:为了将汉字在显示器或打印机上输出,把汉字按图形符号设计成点阵图,而得到的相应的点阵代码(字形码)。
作者: powerbat    时间: 2011-12-1 23:25

如果是vbs/js,字符本来就是以Unicode形式存储在内存中的。

你这个问题似乎要深入到操作系统内部了。。
最后肯定是有API去查表的,ANSI与Unicode的映射。
好像“代码页”这玩意就是这个功能?
作者: wankoilz    时间: 2011-12-2 02:13

本帖最后由 wankoilz 于 2011-12-2 02:25 编辑

对的,我想问的并不是内码转换的程序实现,而是转换程序在转换的过程中干了什么。
楼上说的查表是最后一步了(“人”的ANSI码 —“人”的字形码—“人”的UNICODE码
),关键是查表的时候用的是“什么东东”来查?到底是不是字形码呢... ...
作者: Demon    时间: 2011-12-2 09:21

为什么你对字形码那么情有独钟?

你自己也说了,如果说存在这样一个供内码转换的表,那么在知道ANSI码的时候自然可以查表得到相应的UNICODE码。

事实上,Windows系统中的确存在这样一个映射表,将GB2312码映射成对应的Unicode码。

举个例子来说,“人”的GB2312码是C8CB,然后去查映射表,C8CB对应的Unicode码是4EBA,这就够了啊,为什么要牵扯到字形码呢?

PS:也许我没有完全理解你在问什么。
作者: Demon    时间: 2011-12-2 09:24

如果是vbs/js,字符本来就是以Unicode形式存储在内存中的。

你这个问题似乎要深入到操作系统内部了。。
...
powerbat 发表于 2011-12-1 23:25


冒昧地问一下,你以前是不是某个论坛的管理员?
作者: wankoilz    时间: 2011-12-2 12:04

感谢楼上。你确定有这么一张表吗,如果是,那我就没什么疑问了。
我主要是想知道事实上是不是这样,而不是猜测哦。
俺以前在verybat呆过,但我不是什么管理员。
作者: Demon    时间: 2011-12-2 13:38

本帖最后由 Demon 于 2011-12-2 13:44 编辑

C:\Windows\System32目录下的*.NLS就是映射表文件,C_936.NLS就是GB2312到Unicode的映射表。

NLS是National Language Support的缩写。

在台湾有一个所谓的“Unicode补完计划”,原理就是通过修改系统自带的C_950.NLS来拓展BIG5编码的字符,让BIG5编码中能显示简体中文。

具体内容可以Google关键词“BIG5 Extension 計畫”,至于百度,劝你还是少用,百度一下什么都不知道。

另:那个问题我问的是powerbat,而不是你。
作者: wankoilz    时间: 2011-12-2 14:48

回复 13# Demon


很好很详细。
我仔细读了你介绍的文章,受益匪浅,不过有个疑问:里面说chr()只支持0到255,但为什么vbs中不是呢,比如chr(-12345)
作者: Demon    时间: 2011-12-2 15:36

回复  Demon


很好很详细。
我仔细读了你介绍的文章,受益匪浅,不过有个疑问:里面说chr ...
wankoilz 发表于 2011-12-2 14:48


我在6楼给出的链接中有,Chr能够接受的参数范围和系统当前的代码页有关,中文系统默认是936,也就是GB2312。
作者: wankoilz    时间: 2011-12-2 19:30

bingo,问题解决,你是个好人Demon,灰长感谢!
作者: powerbat    时间: 2011-12-2 21:50

回复 11# Demon

偶以前也在verybat呆过,也不是管理员 ^_^
作者: wankoilz    时间: 2011-12-2 22:31

回复 17# powerbat


   




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2