首先感谢大家在百忙之余能看我的帖子!祝各位新年快乐!!问题一:刚刚看《windows程序设计》里面有一句原话如下:“Windows NT从底层支援Unicode。这意味着Windows NT内部使用由16位字符组成的字符串。因为世界上其它许多地方还不使用16位字符串,所以Windows NT必须经常将字符串在操作系统内转换。Windows NT可执行为ASCII、Unicode或者ASCII和Unicode混合编写的程序。即,Windows NT支持不同的API函数呼叫,这些函数接受8位或16位的字符串(我们将马上看到这是如何动作的。)……”这是不是意味着Unicode是Windows NT系统的机内码?
问题二:我的电脑用的是Win7操作系统,有没有什么命令能够直接查询我操作系统使用的机内码?
问题二:我的电脑用的是Win7操作系统,有没有什么命令能够直接查询我操作系统使用的机内码?
解决方案 »
- MFC生成不同随机数
- 如何强行关闭 CInternetSession 建立的连接
- SetWindowPos怎么没起作用呀?晕菜!!
- MFC的bug,UINT GetMenuItemCount() 失败,怎么可能返回 -1 ?
- 菜鸟问题:建立数据库的时候如果选择"查看使用文件支持",为什么类中就没有****set类了呢?
- VB调用vc dll,想参数是int(int),在vb中选As Integer传进去数字不对!
- 明天辞职,这是我的辞职报告!
- 关于休眠函数问题?
- 请教 数据是16个字节,数据和包的比例 16/(14+20+20+16)中的14是什么?
- 什么情况下对象要new出来
- VC文本框显示问题
- 想在屏幕上画出条直线,编译通过,但是看不到效果,求高人指点~~~
Unicode是可以包含世界上任何语言的编码方式,一开始的ANSI编码只能包含以英文26个字母为语言的国家的语言,但是像中国、韩国、日本、俄罗斯等国家语言是不支持的,所有用来Unicode编码
Windows 2000是用Unicode重新开发的,2000以后的内核同样是Unicode编码
但是为了与ANSI兼容,提供了ANSI的接口API,在内部是将ANSI转换成Unicode后调用Unicode的接口API,是系统为你做了转换,其实是不存在ANSI接口API的实现的
1、Machine Code,又称为Machine Language,即cpu能执行的机器指令,所有编程语言必须转换为Machine Code才能被cpu执行。详细含义可参考http://www.linfo.org/machine_code.html
2、汉字机内码,又称“汉字ASCII码”,简称“内码”,指计算机内部存储,处理加工和传输汉字时所用的由0和1符号组成的代码。大部分汉字系统都采用将国标码每个字节高位置1作为汉字机内码。楼主看《windows程序设计》的那段话,引出机内码的概念,不知道是指上面哪一种。
真的很奇怪
你可能被机内码这个名字忽悠了
机内码和windows7没什么关系,机内码就是一种用于存储汉字编码,如果不用中文windows7根本用不着机内码
unicode和机内码不一样
用户态包括:第三方应用程序,windows子系统。
内核态:windows内核组件,内核驱动。
当用户态程序需要使用系统功能得时候,会通过2E中断(win2k)或者sysiner指令(xp之后)进入到内核态。比如:API函数WriteFile用于写文件,这个函数,在ntdll.dll中,将参数和功能码压栈,然后sysiner进入内核模式,内核程序根据ssdt查找相应功能码,然后处理。这其实就进入了内核态。windows API即是应用程序接口,用户态接口。例如:ReadFile,这个函数既支持unicode又支持ansi。
但是这个函数在从用户态转换到内核态的时候,会把ansi字符串转换成unicode字符串。意思就是说,windows内核是基于UNICODE的。所有用户态调用,进入内核态之后,ansi字符串参数都会被转换成unicode字符串。只要做过内核开发的,都会明白这一点。希望我说的对你有帮助。
比如OutputDebugStringW就封装OutputDebugStringA
导出表是ansi的,因此GetProcAddress就是ansi,MmGetSystemRoutineAddress要把unicode先转成ansi才能继续
谢谢你 当然有帮助既然大家都说UNicode不是机内码,《Unicode汉字内码表》用在什么地方呢
GB码国家标准委员会制定的标准,一般的GB码是指GB2312,这是1980年国家制定的标准,也是最早的国家字符集标准。后来为了处理能力的扩展而指定了GBK(国标扩展)码,汉字范围已经增加不少。最新出台(大概去年)的是最新的标准,GB18030。GB,GBK都是双字节编码。GB18030则是一个混合体,包括单字节(0x00-0x7f),双字节(等同于gbk),还有四字节编码(当然这些是非常生僻的汉字)。 UNICODE则是一个国际标准(universal code),采用双字节编码,不仅英文字符(包括控制字符)还是汉字都采用双字节编码。其目的在于各国信息的交流,处理上也很方便。(汉字中有一个国家标准叫gb13000,其编码顺序就是和UNICODE兼容的。)
所以每一种编码都应该有一种两种形式。
而对于Unicode来说,像U+1234这样的形式的就是它本身的编码。但是要到它的机内码就是UTF-8之类的形式,比如Windows用的主要是UTF-16 little endian这种机内码。
即使内核设计是基于Unicode的,但是它也无法阻止某些内核驱动程序使用ANSI字符来处理东西。所以LZ引用的那句话没有意义。
因为“机内”这个概念并不限定是内核中,只要是机器内部存储处理的都是机内。只不过Windows设计时选择用UTF-16LE,另外由于也兼容ANSI程序,一台Windows PC里最常用的机内码应该就是UTF-16LE和某种ANSI编码(比如GB18030、Big-5之类的)
“所以LZ引用的那句话没有意义。”的意思是楼主引用的这段话和讨论什么样的机内码不相关。
具体要到某个具体程序里的某个代码上下文,看看它使用了那种形式编码的字符串资源,就是那种的机内码。
我说的“机内码”这个词来自于
http://wenku.baidu.com/view/85d34960ddccda38376baff4.html?from=rec&pos=2&weight=1&lastweight=1&count=4这篇文章中的一段(如下):机内码
国标码是汉字信息交换的标准编码,但因其前后字节的最高位为0,与ASCII码发生冲突,如“保”字,国标码为31H和23H,而西文字符“1”和“#”的ASCII也为31H和23H,现假如内存中有两个字节为31H和23H,这到底是一个汉字,还是两个西文字符“1”,和“#”?于是就出现了二义性,显然,国标码是不可能在计算机内部直接采用的,于是,汉字的机内码采用变形国标码,其变换方法为:将国标码的每个字节都加上128,即将两个字节的最高位由0改1,其余7位不变。
如:由上面我们知道,“保”字的国标码为3123H,前字节为00110001B,后字节为00100011B,高位改1为10110001B和10100011B即为B1A3H,因此,“保”字的机内码就是B1A3H。(可用GBK内码输入法验证)
其实他说的意思就是内码的意思。好吧!我承认我被这篇文章搞晕了,或者说这篇文章说的这个词本来就有歧义或多层意思。
在dos下有没有什么命令 能直接查询系统使用的是什么内码呢?
你所说的机内码指的是什么??机器内部数据只有0,1。至于一个数字到底是数据,还是指令码,在执行到之前都是不确定的。
CPU要根据上下文去决定。如果你说的是,操作系统内部字符串编码的话,那么windows操作系统内部就是unicode编码。
UNICODE是世界性编码。
像Unicode编码U+1234这样的东西,并不是计算机内直接使用的。Unicode与UTF-8/16/32这样的具体编码的关系,和国标码与GB2312内码的关系类似。跟你说了,即使在NT核心的系统上,运行的16位程序(尤其是控制台程序/DOS程序)一般都是使用ANSI本地编码的。从这个意义上说,机内码是具体到某个应用某个程序片段里,使用何种编码形式来存储和处理汉字。
而多种这样的方式在整个系统中可以同时共存的。即使是内核是ANSI的Win9x/ME,只要安装了Unicode支持层的话,也可以跑Unicode程序。这个时候对于一个Unicode程序内部,显然用的就是UTF-16LE这种机内码。另外:
国标码是区位码每个字节加上0x20(即32),而计算机实际内部用的GB2312编码是国标码加上0x80(即128)。所以说GB2312的机内码就是区位码每个字节加上0xA0(即160)。你所看的那个教材太过陈旧,只将汉字机内编码局限为GB2312。并没有提到Unicode编码的UTF机内形式。
如果仅是这样的话,ANSI的也会产生此问题啊。
对的,但“什么都可以表示文字”?得要一个规范,没规范就乱了。如在计算机中要表示“A”,ANSI规定用二进制表示为“01000001”(十六进制0x41)。没有一个规范,就乱套了,全世界的计算机将不通用。这里的“A”表示为“01000001”,就是美国的ANSII。如在计算机中要表示“中”,中国大陆规定用二进制表示为“1101011011010000”(十六进制0xD6D0),这就是GB2312标准/GBK标准。中国台湾/香港规定用二进制表示为“1010010010100100”(十六进制0xA4A4),这就是GB5标准(俗称“大五码”)。早期GB2312与BIG5相互转换不好,经常出现乱码。GB2312标准能表示6763个汉字,所以那个时候“朱镕基”的“镕”电脑显示/处理不出来,因为“镕”字没有成为GB2312的标准。GBK标准能表示21003个汉字,能显示/处理“镕”字了。GB5标准能表示13070个汉字。现在,中国大陆的GB18030-2001标准(2001年实施)能表示27533个汉字,GB18030-2005标准能处理7万多个汉字。上面讲的,(如“A”表示为“0x41”)等ANSII,GB2312/GBK/GB18030,BIG5,都是指“机内码”。
“机内码”一词应理解为“计算机内部表示字符的编码”。因为世界上除汉语外,还有日语/韩语等“东亚”语言,各国都有其它不同的标准,所以,UNICODE为了能表示全世界所有的文字/字符,就把所有的文字/字符都用两个字节表示(包括字母、数字)。UNICODE秘ANSII的编码不相同。同理,UNOCIDE也是“机内码”。所以“机内码”有两个含义:ANSI和UNICODE。特别指出的是,中国政府在UNICODE中几乎没有发言权,所以中国政府不趋向于UNICODE,而是使用自己的国标码(GB18030中,不常的汉字用4个字节表示),但是,因为Windows几乎“占领”了全世界,只能默认使用UNICODE码了,在GB18030中,除了规定自己的GB码外,还列出了对应的UNICODE码。
在XML、URL里用的是UTF-8,Windows的Unicode程序内部用UTF-16LE。
Windows只要安装的对应的代码页表和语言支持,是可以处理其它语言的机内码的。所以没48楼说的限制。
你说的太对了,
我早就怀疑怎么会有《Unicode汉字内码表》了,差点被局限了,
国标码 与 GB2312内码
Unicode 与 UTF-8/16/32
关系类似
这句话我能这么理解么?不管内核是ANSI编写的Win9x/Me,还是内核是Unicode编写的WinNT,内核的编码是不能改变的,它跟内码(GB2312或者UTF8/16/32)没有关系,不会因为内核是Unicode编码写的,所以机内码就是Utf-X吧,或者说不会因为内核是Ansi编码,机内码就是GB2312吧?
传统上看,计算机处理的数据(特别是文件),分为二进制与文本二进制没有歧义
文本就是个乱七八糟的东西了
在ascii码的领域,文本是很一目了然的,bios和打印机的随机rom里都有其常用点阵图形(很老的)
是汉字把问题搞复杂了,一块汉卡就制造了巨人那时候,说机内码,通常就是汉字的gb2312编码,两个字节,用于存储、交换,与字形码、输入编码(拼音、区位、五笔)之类的东西相区别至于unicode,ansi,狡辩地说,肯定都是机内码了,我们不是一直在NT上存储、处理交换各种非UNICODE的文字信息吗?在WIN98之后,Windows的内核全部由Unicode实现,所以也许应该称之为“OS内核码”更恰当,unicode的好处是显然易见的,我们2000年前写的那些程序真他妈让人闹心,法国人想用都搞不定:(