如何在应用程序中更改windows ANSI api的CP_ACP(0)
How to change the CP_ACP(0) of windows ANSI apis in an application?
我尝试使用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
是系统默认代码页。
相关文章:
- 无法使用 ILOG CP 的 C++ API 访问决策变量
- 为什么没有用户提供的cp/mv ctor并且具有虚函数但没有虚拟基的类没有"trival cp/mv ctor"?
- C++ 将目录复制到另一个目录(Linux cp 命令)
- Visual Studio 2015 OpenCV Assertion 在 cv::imshow windows 中失败 (size.width>0 && size.height>0.cp
- 捕获SIGVTALRM信号,cp
- 如何使用V2 CP样本自定义Windows 10凭据提供程序
- 由Bagon先生提供的用于Mean Shift Segmentation的eddison_wrapper_mex .cp
- g++4.2:内部编译器错误:在make_thunk中,cp/method.c:129
- 如何将C/C++编译为CP/M-86可执行文件(CMD)
- OSX 10.8.5 上的 Android 构建错误:cp:-R 和 -r 选项不能一起指定