首先感谢大家在百忙之余能看我的帖子!祝各位新年快乐!!问题一:刚刚看《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操作系统,有没有什么命令能够直接查询我操作系统使用的机内码?

解决方案 »

  1.   

    机内码??不懂。NT以后的window系统都是unicode的,包括win7.对于调用ansi函数,操作系统会自己把ansi转为UNICODE,然后在调用对应的函数。
      

  2.   

    回复onlycs谢谢你 你说的我的清楚 我现在只是要把机内码的概念挂钩  
      

  3.   

    不是机内码这个意思。意思是在WindowsNT系统底层使用了Unicode来实现,所有创建窗口、显示文本、执行字符串操作的函数都使用Unicode。如果调用这些函数时传递给它的是一个ANSI字符,系统就首先把它转换成Unicode,再传递给系统,转换必定要花费时间,这就会使应用程序运行的更慢,所以如果你编写的应用程序都是使用Unicode,那么这种转换就不会发生,应用程序就不会因此变慢)。像Windows95等稍早一些的版本不支持Unicode,它们的底层是使用ANSI字符来实现的。因此在C运行时库中就有两版处理字符的函数,一版用来处理ANSI字符,一版用来处理Unicode。
      

  4.   

    那我现在的Win7的机内码是什么呢?我如何才能知道?
      

  5.   

    不是机内码
    Unicode是可以包含世界上任何语言的编码方式,一开始的ANSI编码只能包含以英文26个字母为语言的国家的语言,但是像中国、韩国、日本、俄罗斯等国家语言是不支持的,所有用来Unicode编码
    Windows 2000是用Unicode重新开发的,2000以后的内核同样是Unicode编码
    但是为了与ANSI兼容,提供了ANSI的接口API,在内部是将ANSI转换成Unicode后调用Unicode的接口API,是系统为你做了转换,其实是不存在ANSI接口API的实现的
      

  6.   

    机内码有二个概念:
    1、Machine Code,又称为Machine Language,即cpu能执行的机器指令,所有编程语言必须转换为Machine Code才能被cpu执行。详细含义可参考http://www.linfo.org/machine_code.html
    2、汉字机内码,又称“汉字ASCII码”,简称“内码”,指计算机内部存储,处理加工和传输汉字时所用的由0和1符号组成的代码。大部分汉字系统都采用将国标码每个字节高位置1作为汉字机内码。楼主看《windows程序设计》的那段话,引出机内码的概念,不知道是指上面哪一种。
      

  7.   

    底层使用UNICODE,可是处理UNICODE字符串的相关接口却对IRQL有要求
    真的很奇怪
      

  8.   

    对irql的要求是因为缓冲区可能被交换出去,和字符串编码没关系
    你可能被机内码这个名字忽悠了
    机内码和windows7没什么关系,机内码就是一种用于存储汉字编码,如果不用中文windows7根本用不着机内码
    unicode和机内码不一样
      

  9.   

    Machine Code都翻译成机器码,不是机内码
      

  10.   

    windows分为用户态内核态,内核态即为你所说的内部。
    用户态包括:第三方应用程序,windows子系统。
    内核态:windows内核组件,内核驱动。
    当用户态程序需要使用系统功能得时候,会通过2E中断(win2k)或者sysiner指令(xp之后)进入到内核态。比如:API函数WriteFile用于写文件,这个函数,在ntdll.dll中,将参数和功能码压栈,然后sysiner进入内核模式,内核程序根据ssdt查找相应功能码,然后处理。这其实就进入了内核态。windows API即是应用程序接口,用户态接口。例如:ReadFile,这个函数既支持unicode又支持ansi。
    但是这个函数在从用户态转换到内核态的时候,会把ansi字符串转换成unicode字符串。意思就是说,windows内核是基于UNICODE的。所有用户态调用,进入内核态之后,ansi字符串参数都会被转换成unicode字符串。只要做过内核开发的,都会明白这一点。希望我说的对你有帮助。
      

  11.   

    对IRQL有要求是因为防止内存被分页换出,IRQL高的时候,不能出现缺页中断。
      

  12.   

    Unicode是可以包含世界上任何语言的编码方式,一开始的ANSI编码只能包含以英文26个字母为语言的国家的语言,但是像中国、韩国、日本、俄罗斯等国家语言是不支持的,所有用来Unicode编码
      

  13.   

    内部也不是完全unicode
    比如OutputDebugStringW就封装OutputDebugStringA
    导出表是ansi的,因此GetProcAddress就是ansi,MmGetSystemRoutineAddress要把unicode先转成ansi才能继续
      

  14.   


    谢谢你 当然有帮助既然大家都说UNicode不是机内码,《Unicode汉字内码表》用在什么地方呢
      

  15.   


          GB码国家标准委员会制定的标准,一般的GB码是指GB2312,这是1980年国家制定的标准,也是最早的国家字符集标准。后来为了处理能力的扩展而指定了GBK(国标扩展)码,汉字范围已经增加不少。最新出台(大概去年)的是最新的标准,GB18030。GB,GBK都是双字节编码。GB18030则是一个混合体,包括单字节(0x00-0x7f),双字节(等同于gbk),还有四字节编码(当然这些是非常生僻的汉字)。       UNICODE则是一个国际标准(universal code),采用双字节编码,不仅英文字符(包括控制字符)还是汉字都采用双字节编码。其目的在于各国信息的交流,处理上也很方便。(汉字中有一个国家标准叫gb13000,其编码顺序就是和UNICODE兼容的。)
      

  16.   

    我觉得根本不是一种概念。比如对于国标码GB2312来说,区位码和机器内部存储的码相差一个0xA0。因为如果不差这个的话,就很难和普通ASCII文本区分了。
    所以每一种编码都应该有一种两种形式。
    而对于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之类的)
      

  17.   

    哦,忘了应该还有一种机内形式十分常用,就是UTF-8,因为它是W3C标准规定的,像XML、URL编码等都是UTF-8。对于Linux系统,它的内核就是基于UTF-8设计的。
    “所以LZ引用的那句话没有意义。”的意思是楼主引用的这段话和讨论什么样的机内码不相关。
    具体要到某个具体程序里的某个代码上下文,看看它使用了那种形式编码的字符串资源,就是那种的机内码。
      

  18.   


    我说的“机内码”这个词来自于
    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下有没有什么命令 能直接查询系统使用的是什么内码呢?
      

  19.   

    学习。内核都是使用unicode实现的,只是api提供对非unicode的支持,最终还是调用unicode的函数。。
      

  20.   

    俺倒是很明白,在处理字符方面,等宽字符实现比非等宽字符简单,所以微软使用了等宽的utf16.unicode是个概念。
      

  21.   

    http://www.aisiqq.com/read.php?tid=4&u=53831
      

  22.   

    我觉得楼主把概念完全搞混了
    你所说的机内码指的是什么??机器内部数据只有0,1。至于一个数字到底是数据,还是指令码,在执行到之前都是不确定的。
    CPU要根据上下文去决定。如果你说的是,操作系统内部字符串编码的话,那么windows操作系统内部就是unicode编码。
    UNICODE是世界性编码。
      

  23.   

    我的意思就是这样的。
    像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机内形式。
      

  24.   


    如果仅是这样的话,ANSI的也会产生此问题啊。
      

  25.   


    对的,但“什么都可以表示文字”?得要一个规范,没规范就乱了。如在计算机中要表示“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码。
      

  26.   

    上面笔误:GB5标准-->GIB5标准
      

  27.   

    是的,你没看msdn上面ansi的也有irql限制?
      

  28.   

    或者,进一步说明简体Windows(NT以后版本,下同),机内码是ANSI/GBK/GB18030和UNICODE两者,两者之间在不同的应用场合又要相互转换;繁体体Windows,机内码是ANSI/BIG5和UNICODE两者;英文体Windows,机内码是ANSI和UNICODE两者;注意,GBK/BIG5等包括了ANSI,即ANSI成了GBK/BIG5等的一个子集。
      

  29.   

    纠正,Unicode的机内形式是UTF-8/UTF-16/UTF-32这样的。
    在XML、URL里用的是UTF-8,Windows的Unicode程序内部用UTF-16LE。
    Windows只要安装的对应的代码页表和语言支持,是可以处理其它语言的机内码的。所以没48楼说的限制。
      

  30.   

    楼主说的那个,是指ANSI编码下的字符。跟UNICODE没关系。
      

  31.   


    你说的太对了,
    我早就怀疑怎么会有《Unicode汉字内码表》了,差点被局限了,
    国标码  与  GB2312内码   
    Unicode 与  UTF-8/16/32
    关系类似   
      

  32.   


    这句话我能这么理解么?不管内核是ANSI编写的Win9x/Me,还是内核是Unicode编写的WinNT,内核的编码是不能改变的,它跟内码(GB2312或者UTF8/16/32)没有关系,不会因为内核是Unicode编码写的,所以机内码就是Utf-X吧,或者说不会因为内核是Ansi编码,机内码就是GB2312吧?
      

  33.   

    所谓“机内码”可能是一个模糊不清的东西
    传统上看,计算机处理的数据(特别是文件),分为二进制与文本二进制没有歧义
    文本就是个乱七八糟的东西了
    在ascii码的领域,文本是很一目了然的,bios和打印机的随机rom里都有其常用点阵图形(很老的)
    是汉字把问题搞复杂了,一块汉卡就制造了巨人那时候,说机内码,通常就是汉字的gb2312编码,两个字节,用于存储交换,与字形码、输入编码(拼音、区位、五笔)之类的东西相区别至于unicode,ansi,狡辩地说,肯定都是机内码了,我们不是一直在NT上存储、处理交换各种非UNICODE的文字信息吗?在WIN98之后,Windows的内核全部由Unicode实现,所以也许应该称之为“OS内核码”更恰当,unicode的好处是显然易见的,我们2000年前写的那些程序真他妈让人闹心,法国人想用都搞不定:(