2010-10-07 37 views
1

正如我们所知,在Windows系统中,我们可以在“控制面板\时钟,语言和区域”中为非Unicode程序设置区域语言。但是,当地语言对于应用程序意味着什么?据我了解,一个应用程序是一个编译后的二进制可执行文件,它只包含机器代码指令和没有数据,所以字符编码如何影响它们的运行?什么是非Unicode应用程序

一个猜测是,如果可执行文件在代码段中包含一些文字字符串,它将使用一些内部字符集来编码它们。如果字符集不是unicode,那么它将显示垃圾。但是,不是内部的Charset是固定的吗?就像在Java中一样,java规范定义了内部编码是UTF-16。

希望有人能回答我的问题,

感谢。

+1

请记住,Unicode并不意味着UTF16,但它在Windows上。他们应该在15年前使用UTF8,而这个问题不存在。 – 2010-10-07 09:20:18

+0

@Matt乔伊纳:实际上,这个问题依然存在。请记住,我们在这里正在讨论_non-Unicode_程序。他们根本不关心_Unicode_程序是否使用UTF8或UTF16。 – MSalters 2010-10-08 14:35:11

回答

4

Windows有两种方法可以让程序与之通话,称为“ANSI API”和“Unicode API”,而“非unicode应用程序”是通过“ANSI API”与Windows通话的方式比“Unicode API”。

这意味着应用程序传递给Windows的任何字符串只是一串字节,而不是一串Unicode字符。 Windows必须决定哪些字符序列与之对应,并且您正在讨论的控制面板设置是如何实现的。

所以例如,设置为使用Windows西方将显示字符ä在PC上输出值为0xE4字节,而一个设置为希伯来语将显示字符ה非Unicode程序。

+0

并且在“ANSI API”中的一个字节意味着屏幕上的一个字符。在Unicode中,屏幕上的字符可以由多个字节表示。 – 2010-10-07 08:23:04

+1

@Amigable Clark Kant:并非总是如此 - “双字节字符集”(请参阅​​http://msdn.microsoft.com/en-us/library/dd317794%28VS.85%29.aspx)仍然使用ANSI API 。否则,Unicode之前可能没有中文版本的Windows! – RichieHindle 2010-10-07 08:33:35

+0

还应该注意的是,Microsoft可以轻松地将UTF-8添加为支持的多字节字符集,并使整个问题消失,但他们拒绝这么做*。 – 2010-10-07 16:40:08

0

非Unicode应用程序是一种主要使用一个多字节编码,其中该字符串由字符* reperesented,不为wchar_t *:

char* myString; 

通过改变所使用的编码,则改变字符设置可用于应用程序。

而且大多数应用程序都包含指令和数据。

+1

@Amigable Clark Kant:不,对于ANSI API和使用'char',“多字节”是正确的。例如,请参阅MultiByteToWideChar API,其中MultiByte表示非Unicode,WideChar表示Unicode。 – RichieHindle 2010-10-07 08:36:00

+1

答案和评论应该说明这是Microsoft创建的不正确的术语。 Unicode的主要编码是UTF-8,一种多字节编码,并且存在宽字符编码不是Unicode的系统。实际上,有人可能会认为它不是Windows上的Unicode,因为Windows的wchar_t太小而不能存储任意的Unicode代码点了。 – 2010-10-07 16:42:24

+0

@Alexander Rafferty:对于数据段,ANSI C使用的内部编码是什么?不是由C定义的,还是我们可以改变? – Alfred 2010-10-07 19:33:23

0

RichieHindle正确地解释了大多数API的一种* W(Unicode)和* A(ANSI)变体。但在此之后,他有点不对。

重要的是要知道* A变体(如MessageBoxA)只是* W版本的包装(如MessageBoxW)。他们将输入的字符串转换为Unicode;他们把输出的字符串转换回来。

在Windows SDK中,对于所有此类A/W对,存在#ifdef UNICODE块,因此MessageBox()是扩展为MessageBoxA()MessageBoxW()的宏。由于所有宏都使用相同的条件,因此许多程序都使用100%* A函数或100%* W函数。那么“非Unicode”应用程序就是而非定义的UNICODE,因此只能使用* A变体。

但是,没有理由不能混合搭配* A和* W功能。混合* A和* W函数的程序是否被认为是“Unicode”,“非Unicode”还是别的?其实,答案也很复杂。当涉及到Clock,Language和Region设置时,应用程序在进行* W调用时被认为是Unicode应用程序,在进行* A调用时被认为是非Unicode应用程序 - 该设置控制* A包装程序转换为* W电话。因此,回到RichieHindle的例子中,如果你调用一个值为(char)0xE4的*函数,包装将转发到* W功能可以使用L'ä'L'ה',具体取决于此设置。如果您直接用值(WCHAR)0x00E4调用* W函数,则不会发生翻译。