众所周知,在windows系统中,我们可以在“控制面板\时钟,语言和区域”中为非Unicode程序设置语言环境语言。但是本地语言对于应用程序意味着什么?根据我的理解,应用程序是一个已编译的二进制可执行文件,它只包含机器代码指令而没有数据,那么字符编码如何影响它们的运行?
一个猜测是,如果可执行文件在代码段中包含一些文字字符串,它将使用一些内部字符集来编码它们。如果charset不是unicode,那么它将显示垃圾。但是内部的Charset不是固定的吗?就像在Java中一样,java规范定义了内部编码是UTF-16。
希望有人能回答我的问题,
感谢。
答案 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函数,则不会发生转换。