Winapi Windows API ANSI函数和UTF-8

Winapi Windows API ANSI函数和UTF-8,winapi,unicode,encoding,utf-8,ansi,Winapi,Unicode,Encoding,Utf 8,Ansi,是否可以将Windows API ANSI函数与UTF-8字符串一起使用 例如,假设我有一个UTF-8编码的路径。我可以调用CreateDirectoryA或CreateFileA并使用UTF-8路径吗?还是在调用函数之前必须执行一些转换?否。使用将UTF-8转换为UTF-16,然后调用宽字符API,例如CreateDirectoryW或CreateFileW,这是一种更简单的方法(而不是使用原始Win32 API MultiByteToWideChar)将使用,如CA2CW。您可以将CP_UT

是否可以将Windows API ANSI函数与UTF-8字符串一起使用

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

否。使用将UTF-8转换为UTF-16,然后调用宽字符API,例如
CreateDirectoryW
CreateFileW
,这是一种更简单的方法(而不是使用原始Win32 API MultiByteToWideChar)将使用,如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”并使用(IMHO,更可读)CreateDirectory:

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

我还要补充一点,因为Windows只使用UTF-16,所以您最好也这样做,在大多数情况下使用UTF-16,并且只在需要从外部源读/写时才转换为UTF-8。@casablanca:另一种被提倡的方法是在大多数情况下使用UTF-8,并且只在UTF-16之间进行转换当与Windows接口对话时,@ Casabraca会导致C++标准库的一些严重问题,不幸的是,像异常消息之类的东西被硬编码为字符,而不是W查尔格。有人建议不要在异常消息中放置Unicode,但是这不是很实用,因为如果需要通信的话。类似“无法打开文件”的方法바위처럼 단단한.带有名称的txt“或”记录바위처럼 단단한 “在异常中不存在”您将无法轻松做到这一点。说“异常不需要unicode”实际上意味着“您的整个代码库仅用于显示目的”。Yikes。为什么会有人希望这样?我想我们现在已经远远超过Windows ME了(这是最后一个需要ANSI API的Windows版本)。它们应该已经消失了,尤其是对于新开发的应用程序。您从哪里获得UTF-8字符串?将应用程序转换为完全使用UTF-16字符串要容易得多,因为所谓的宽版本Windows API函数需要。正如Joey所说,始终调用宽版本(带有
W
后缀),不是ANSI版本。这些已经过时几十年了。@Joey:因为有很多C(++)库(包括标准库!)更喜欢使用基于字符的字符串,而不是基于字符的字符串。如果Windows完全支持UTF-8,那么您可以在整个程序中使用UTF-8,而不必一直在UTF-8和UTF-16之间转换。@dan04:UTF-16是处理的最佳Unicode编码(UTF-8适合存储),请参阅这篇有趣的文章:(还要注意,C#和Java都对其字符串类使用UTF-16编码)。@user1149224 UTF-16-processing代码与UTF-8-processing代码一样复杂。UTF-32-processing代码更简单。