【问题标题】:Windows API ANSI functions and UTF-8Windows API ANSI 函数和 UTF-8
【发布时间】:2012-02-08 12:13:57
【问题描述】:

是否可以使用带有 UTF-8 字符串的 Windows API ANSI 函数?

例如,假设我有一个以 UTF-8 编码的路径。我可以调用CreateDirectoryA 或CreateFileA 并使用UTF-8 路径,还是必须在调用函数之前执行一些转换?

【问题讨论】:

  • 哎呀。为什么会有人想要那个?我认为我们现在已经超越了 Windows ME(这是最后一个需要 ANSI API 的 Windows 版本)。它们应该已经消亡了,尤其是对于新开发的应用程序。
  • 您从哪里获得 UTF-8 字符串?将您的应用程序转换为完全使用 UTF-16 字符串要容易得多,因为所谓的宽版本 Windows API 函数需要。正如 Joey 所说,总是 调用宽版本(带有 W 后缀),而不是 ANSI 版本。这些已经过时了几十年。
  • @Joey:因为很多 C(++) 库(包括标准库!)更喜欢使用基于char 的字符串而不是基于wchar_t 的字符串。如果 Windows 完全支持 UTF-8,那么您可以在整个程序中使用 UTF-8,而不必一直在 UTF-8 和 UTF-16 之间转换。
  • @dan04:UTF-16 是最好的处理 Unicode 编码(UTF-8 可以用于存储),请参阅这篇有趣的文章:unicode.org/notes/tn12(还要注意 C# 和 Java 都使用 UTF-其字符串类的 16 种编码)。
  • @user1149224 UTF-16 处理代码的复杂程度不亚于 UTF-8 处理代码。 UTF-32 处理代码要简单得多。

标签: winapi unicode encoding utf-8 ansi


【解决方案1】:

没有。使用MultiByteToWideChar将UTF-8转为UTF-16,然后调用CreateDirectoryW或CreateFileW等宽字符API。

【讨论】:

  • 我还要补充一点,由于 Windows 仅使用 UTF-16,因此您最好效仿并​​在大多数情况下使用 UTF-16,并且只转换为 UTF-8当您需要从外部源读取/写入时。
  • @casablanca:另一种被提倡的方法是在大多数情况下使用 UTF-8,并且仅在与 Windows 界面对话时转换为 UTF-16。
  • @casablanca 不幸的是,这会给 C++ 标准库带来一些严重的麻烦,像异常消息这样的东西被硬编码为 char,而不是 wchar_t。有些人建议不要将 unicode 放在异常消息中,但这不是很实用,因为如果您需要传达“无法打开文件 바위처럼 단단한.txt”或“名称为 바위처럼 단단한 的记录不存在”之类的信息在例外情况下,您将无法轻松做到这一点。说“异常不需要 unicode”实际上意味着“您的整个代码库仅将 unicode 用于显示目的”。
【解决方案2】:

一种更简单的方法(比使用原始 Win32 API MultiByteToWideChar)是使用 ATL conversion helpers,例如 CA2CW。您可以将 CP_UTF8 指定为代码页(构造函数中的第二个参数),以将 Unicode UTF-8 转换为 Unicode UTF-16:

CreateDirectoryW( 
  CA2W( utf8Name, CP_UTF8 ) // convert from UTF-8 to UTF-16
  ... // other stuff
);

请注意,在 Unicode 版本中(现在应该是默认版本),CreateDirectory 只是扩展为 CreateDirectoryW,所以我只需删除结尾的“W”并使用(恕我直言,更易读)CreateDirectory:

CreateDirectory( 
  CA2W( utf8Name, CP_UTF8 ) // convert from UTF-8 to UTF-16
  ... // other stuff
);

【讨论】:

    【解决方案3】:

    接受的答案不再正确(从 Windows 版本 1903(2019 年 5 月更新)开始)。

    应用程序现在可以将进程的活动代码页设置为 UTF-8。这允许...A 函数(和CP_ACP)使用UTF-8。执行此操作的清单如下所示

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
      <assemblyIdentity type="win32" name="..." version="6.0.0.0"/>
      <application>
        <windowsSettings>
          <activeCodePage xmlns="http://schemas.microsoft.com/SMI/2019/WindowsSettings">UTF-8</activeCodePage>
        </windowsSettings>
      </application>
    </assembly>
    

    来源和附加信息:Use the Windows UTF-8 code page

    【讨论】:

      猜你喜欢
      • 2011-09-22
      • 1970-01-01
      • 2011-09-24
      • 2011-05-20
      • 2015-10-06
      • 1970-01-01
      • 2014-07-02
      • 2018-10-24
      • 1970-01-01
      相关资源
      最近更新 更多