哪些版本的Windows不支持unicode 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调用似乎更容易、更清晰。维基

基于C的Win32 API有许多函数的双版本,支持unicode(UTF-16)字符串和旧的8位代码页字符串。API还定义了泛型函数和类型,以便在某种程度上抽象这些函数和类型,并允许从同一代码库编译这两个版本


Microsoft建议始终使用泛型(请参阅),以便可以编译这两个版本。但我的问题是——我们这里说的是通过8位字符串API支持哪些版本的windows?如果是Windows95,我的优先级就没有那么高了:)。如果泛型仅用于支持极端遗留情况,那么直接使用UTF-16调用似乎更容易、更清晰。

维基百科有一篇详细的文章:

首先,我将解释Windows支持的三种字符串文本编码类型:

  • “ANSI”=C中的8位编码-
    char
    。尽管名称为“ANSI”,但这不一定是ASCII,也不一定是任何特定的ANSI编码或ASCII,而是无论当前语言环境/代码页是什么
  • “MBCS”=C中的多字节字符集编码-
    char
    (其中每个字节都是
    char
    。支持的代码页列表是有限的,关键是不包括UTF-8。请参阅此QA:)。MBCS在现代Windows中已被弃用,不应在新项目中使用
  • “Unicode”=UTF-16(或NT3/NT4中的UCS-2)
    wchar\u t
    在C中为16位。
    • 在UCS-2下,只能使用由码点
      0x0000
      -
      0xFFFF
      表示的字符。不能使用此范围之外的字符
    • 在UTF-16(Windows 2000及更高版本)中,
      0xFFFF
      之后的代码点由2个或更多的
      wchar\u t
      值(4个或更多字节)表示,称为代理项对,这意味着字符串的二进制长度(以字节为单位)不一定与字符串的元素长度(以
      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个字符之间的连字)
  • 视窗3.x Windows 3.x实现了16位Windows API,严格来说是8位的。如果不运行en-US版本,它将使用当前默认的语言环境和代码页设置。它不支持宽字符,但可能支持某种MBC

    Windows 3.x的“Win32子集”(“Win32 S”)加载项在Windows 3.x中添加了一些Win32函数,包括
    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)。

    此时,泛型已经存在