Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么是非unicode应用程序_Java_C_Operating System - Fatal编程技术网

Java 什么是非unicode应用程序

Java 什么是非unicode应用程序,java,c,operating-system,Java,C,Operating System,众所周知,在windows系统中,我们可以在“控制面板\时钟、语言和区域”中为非Unicode程序设置语言环境。但是本地语言对于应用程序意味着什么呢?根据我的理解,应用程序是一个编译过的二进制可执行文件,只包含机器代码指令,没有数据,那么字符编码如何影响它们的运行呢 一种猜测是,如果可执行文件在代码段中包含一些文字字符串,它将使用一些内部字符集对其进行编码。如果字符集不是unicode,那么它将显示垃圾。但内部字符集不是固定的吗?与Java一样,Java规范定义内部编码为UTF-16 希望有人能

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

一种猜测是,如果可执行文件在代码段中包含一些文字字符串,它将使用一些内部字符集对其进行编码。如果字符集不是unicode,那么它将显示垃圾。但内部字符集不是固定的吗?与Java一样,Java规范定义内部编码为UTF-16

希望有人能回答我的问题


谢谢。

非unicode应用程序主要使用多字节编码,其中字符串由char*而不是wchar\u t*重新呈现:

char* myString;
通过更改使用的编码,可以更改应用程序可用的字符集


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

Windows有两种程序与之对话的方法,称为“ANSI API”和“Unicode API”,“非Unicode应用程序”是通过“ANSI API”而不是“Unicode API”与Windows对话的应用程序

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


例如,一个非unicode程序在使用Windows Western的PC机上输出一个值为0xE4的字节,它将显示字符ä,而一个为希伯来语设置的程序将显示字符הRichieHindle正确地解释了大多数API有两种变体,a*W(unicode)和a*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”或其他类型的程序吗?事实上,答案也是喜忧参半。当涉及到时钟、语言和区域设置时,应用程序在进行*W调用时被视为Unicode应用程序,而在进行*a调用时被视为非Unicode应用程序-该设置控制*a包装如何转换为*W调用。在多线程程序中,您可以同时使用这两个线程(!)


因此,回到RichieHindle的例子,如果调用值为
(char)0xE4
的*a函数,包装器将根据此设置使用
转发到*W函数。如果随后直接使用值
(WCHAR)0x00E4
调用*W函数,则不会进行转换。

在“ANSI API”中,一个字节表示屏幕上的一个字符。在Unicode中,屏幕上的字符可以用一个以上的字节来表示。@Amigable Clark Kant:不总是正确的-“双字节字符集”(请参阅)仍然使用ANSI API。否则,在Unicode之前可能没有中文版本的Windows!还应该注意的是,微软可以很容易地将UTF-8添加为受支持的多字节字符集,从而解决整个问题,但他们拒绝这样做。@RichieHindle:很好的解释。正如您所说,当应用程序调用windowsapi时,它只传递“一个字节序列”。那么,编码中的“字节序列”是否与源代码相同?我的意思是,如果源代码是用UTF-8编写的,那么它们就是UTF-8;如果源代码以GBK为单位,则字节序列以GBK为单位。这意味着ANSI C不像Java(utf-16)那样具有固定的内部编码。@郭琴:不,C没有为其源代码或字符串文本定义标准编码。非Unicode程序输出的字符串文字将由源代码中存在的相同字节组成,无论使用何种编码。@Amigable Clark Kant:不,“多字节”对于ANSI API和使用
char
都是正确的。例如,请参阅
MultiByteToWideChar
API,其中
MultiByte
表示非Unicode,而
WideChar
表示Unicode。答案和注释应说明这是Microsoft创建的不正确术语。Unicode的主要编码是UTF-8,这是一种多字节编码,并且存在宽字符编码不是Unicode的系统。事实上,有人可能会说它在Windows上不是Unicode,因为Windows的
wchar\t
太小,无法存储任意Unicode码点…@Alexander Rafferty:那么对于数据段,ANSI C中使用的内部编码是什么?不是由C定义的,或者我们可以更改它?@RichieHindle:MultiByte表示多字节,WideChar表示宽字符。有很多系统使用utf-8表示多字节字符,而C标准中没有规定宽字符应为Unicode或ISO/IEC 10646。@郭琴:我希望你不要混淆ANSI C(大致相当于ISO 9899,ISO C)和Windows ANSI API,之所以这么叫是因为Windows使用的一些代码页基于ANS的草稿