什么是非unicode应用程序

时间:2010-10-07 08:05:39

标签: java c operating-system

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

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

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

感谢。

3 个答案:

答案 0 :(得分:4)

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

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

例如,在设置为使用Windows Western的PC上输出值为0xE4的字节的非unicode程序将显示字符ä,而设置为希伯来语的字符将显示字符的ה

答案 1 :(得分:0)

非unicode应用程序主要使用多字节编码,其中字符串由char *重复,而不是wchar_t *:

char* myString;

通过更改使用的编码,您可以更改应用程序可用的字符集。

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

答案 2 :(得分: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的* A函数,则包装器将转发到* W函数,其中L'ä'L'ה'取决于在这个设置上。如果您随后使用值(WCHAR)0x00E4直接调用* W函数,则不会发生转换。