哪些版本的Windows不支持unicode API调用?
基于C的Win32 API有许多函数的双版本,支持unicode(UTF-16)字符串和旧的8位代码页字符串。API还定义了泛型函数和类型,以便在某种程度上抽象这些函数和类型,并允许从同一代码库编译这两个版本哪些版本的Windows不支持unicode API调用?,c,windows,unicode,C,Windows,Unicode,基于C的Win32 API有许多函数的双版本,支持unicode(UTF-16)字符串和旧的8位代码页字符串。API还定义了泛型函数和类型,以便在某种程度上抽象这些函数和类型,并允许从同一代码库编译这两个版本 Microsoft建议始终使用泛型(请参阅),以便可以编译这两个版本。但我的问题是——我们这里说的是通过8位字符串API支持哪些版本的windows?如果是Windows95,我的优先级就没有那么高了:)。如果泛型仅用于支持极端遗留情况,那么直接使用UTF-16调用似乎更容易、更清晰。维基
Microsoft建议始终使用泛型(请参阅),以便可以编译这两个版本。但我的问题是——我们这里说的是通过8位字符串API支持哪些版本的windows?如果是Windows95,我的优先级就没有那么高了:)。如果泛型仅用于支持极端遗留情况,那么直接使用UTF-16调用似乎更容易、更清晰。维基百科有一篇详细的文章: 首先,我将解释Windows支持的三种字符串文本编码类型:
char
。尽管名称为“ANSI”,但这不一定是ASCII,也不一定是任何特定的ANSI编码或ASCII,而是无论当前语言环境/代码页是什么char
(其中每个字节都是char
。支持的代码页列表是有限的,关键是不包括UTF-8。请参阅此QA:)。MBCS在现代Windows中已被弃用,不应在新项目中使用wchar\u t
在C中为16位。
- 在UCS-2下,只能使用由码点
-0x0000
表示的字符。不能使用此范围之外的字符0xFFFF
- 在UTF-16(Windows 2000及更高版本)中,
之后的代码点由2个或更多的0xFFFF
值(4个或更多字节)表示,称为代理项对,这意味着字符串的二进制长度(以字节为单位)不一定与字符串的元素长度(以wchar\u t
为单位)成正比,这也不一定是打印字符的数量size\u t
- 还考虑了诸如结绳和发音符号之类的东西也打破了编程代码经常产生的字节/元素/打印字符计数等价假设。
- 作为一个例子,考虑这个代码点字符串:
- 在UTF-16大端字节中,这是
00 61 09 28 09 3F 4E 9C D8 00 DC 83
- 这是12个字节
- …这是6个
元素wchar\t
- …但代表5个字符
- …呈现为4个打印字符(由于第2个和第3个字符之间的连字)
- 在UTF-16大端字节中,这是
A
和W
函数,但是W
函数是存根的,调用时返回故障代码-与Windows 95上的“完整”Win32相同
Windows 95、98、Me:
在Windows9X(95、98、Me)上实现的Win32不支持UTF-16,只支持“ANSI”或“MBCS”字符串
一个重要的注意事项是,与Win32s一样,-除此之外,它处理UCS-2字符串(例如MessageBoxExW
)
支持非拉丁字符集需要混淆代码页和神秘的“多字节”编码选项(记住,这些选项不支持UTF-8,除了MultiByteToWideChar
和WideCharToMultiByte
,可用于将UTF-8转换为UTF-16以与Win32 API一起使用)
2001年,微软为Windows 9x发布了一个名为Microsoft Layer for Unicode(MSLU)的附加组件,它将W
函数从失败的存根更改为将字符串转换回8位格式的thunking代理,然后调用A
函数,因此,明确使用W
函数的程序可以在Windows9x上运行
Windows NT
Windows NT,从一开始就是NT 3.1(没有3.0版本),它附带了接受wchar\t
类型参数的W
函数。字符串用UCS-2(NT3、NT4)或UTF-16(NT5及更高版本)编码。Microsoft产品和文档通常使用“Unicode”作为UTF-16或UCS-2的简写。Win32不支持UTF-8(除了MultiByteToWideChar
和WideCharToMultiByte
),因此模糊性很难通过
Windows CE
Windows CE 1从一开始就支持UTF 16,考虑它的支持级别相当于Windows NT家族。我不知道CE何时或是否曾经支持UCS-2而不是UTF-16,或者从一开始就是UTF-16
简言之:OS ANSI | MBCS | UTF-16(“Unicode”)
-----------------------------------------------------------------------------
Windows 3.x(股票)是|?|不
Windows 3.x(Win32s)是|?|存根,总是失败(a)
Windows 95、98、ME是|是|有限支持(b)否则将失败
Windows 95、98、ME(MSLU)是|是|是,运行时符合ANSI(c)
Windows NT 3.x、NT 4.x是|是|作为UCS-2而不是UTF-16(d)
Windows 2000及更高版本是|是|是
Windows CE 1.0及更高版本是|?|是(e)
(a) :(b) : (c) :
(d) :
(e) :
结论:只需使用“Unicode”:即使您正在编写针对Windows 9x的软件,您也可以使用Unicode层,它仍然可以运行(尽管Unicode文件名和窗口标题等内容可能不可靠)。您的代码也可以移植到Windows CE(我很惊讶地看到Windows CE从一开始就支持UTF-16)。此时,泛型已经存在