如何在应用程序中更改Windows ANSI apis的CP_ACP(0)?

leg*_*lee 4 c++ unicode winapi utf-8 codepages

我尝试使用dll库绘制文本,该库只有ANSI版本封装的窗口ANSI apis的接口,但我需要使用utf-8存储字符串数据.我不想使用MultiByte/WideChar函数转换字符串,所以我想要一种方法来改变我的应用程序中的CP_ACP,这样我就可以将字符串数据输入到ANSI apis中.谢谢.

ps:我不更改系统默认代码页.

Dan*_*zar 8

从 Windows 10 v1903 开始​​,您可以使用应用程序清单来设置给定进程的活动代码页,该代码页可能与系统范围的代码页不同:

<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>
Run Code Online (Sandbox Code Playgroud)

显然,如果您需要支持旧版本的 Windows,应用程序仍然必须意识到CP_ACP可能不支持CP_UTF8,并自行执行任何必要的转换。

更多详细信息可以在Microsoft 文档中找到。


Rem*_*eau 5

CP_ACP代表系统Ansi代码页.您无法在每个进程或每个线程的基础上更改它.这是一个系统范围的设置.如果DLL真的依赖于CP_ACP内部,那么除了在与DLL交互时将你的转换为/转换为UTF-8,别无选择.