如何在应用程序中更改windows ANSI api的CP_ACP(0)

How to change the CP_ACP(0) of windows ANSI apis in an application?

本文关键字:CP ACP api ANSI 应用程序 windows      更新时间:2023-10-16

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

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

CP_ACP表示系统Ansi代码页。您不能在每个进程或每个线程的基础上更改它。这是一个全系统的设置。如果DLL在内部确实依赖于CP_ACP,那么无论何时与DLL交互,您都别无选择,只能将从/转换为UTF-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>

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

有关详细信息,请参阅Microsoft文档。

UTF8不是一个代码页,并且由于代码页只对ANSI函数有意义,所以您不能按要求执行。

如果您想将字符串存储为UTF8,则需要使用MultiByteToWideChar()将应用程序的ANSI转换为unicode(宽字符),然后使用WideCharToMultiByte()转换为UTF8。

或者,更新您的应用程序以在内部使用unicode/wide字符串,并根据需要进行转换。

"如何更改CP_ACP?"-"我不想更改系统默认代码页。"

好吧,你必须做出选择。CP_ACP系统默认代码页。