Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在将ASCII字符串传递给Windows API函数之前将其转换为UTF-16_C++_Windows_Winapi_Unicode_Encoding - Fatal编程技术网

C++ 在将ASCII字符串传递给Windows API函数之前将其转换为UTF-16

C++ 在将ASCII字符串传递给Windows API函数之前将其转换为UTF-16,c++,windows,winapi,unicode,encoding,C++,Windows,Winapi,Unicode,Encoding,在我当前的项目中,我一直在使用宽字符(utf16)。但是,由于用户的唯一输入是一个url,它必须以ascii结尾,还有一个字符串,所以我正在考虑将整个程序切换到ascii 我的问题是,在将字符串传递给Windows API函数之前,将其转换为utf16有什么好处吗 在网上做了一些研究之后,如果你不在windows上使用UTF-16,似乎很多人都建议你这样做。主要的一点是,在windows上,UTF-16是本机编码,所有以a结尾的API函数都只是W函数的包装。A函数只是作为与为Windows 9x

在我当前的项目中,我一直在使用宽字符(utf16)。但是,由于用户的唯一输入是一个url,它必须以ascii结尾,还有一个字符串,所以我正在考虑将整个程序切换到ascii

我的问题是,在将字符串传递给Windows API函数之前,将其转换为utf16有什么好处吗


在网上做了一些研究之后,如果你不在windows上使用UTF-16,似乎很多人都建议你这样做。

主要的一点是,在windows上,UTF-16是本机编码,所有以
a
结尾的API函数都只是
W
函数的包装。
A
函数只是作为与为Windows 9x/ME编写的程序的兼容性而存在,事实上,任何新程序都不应该使用它们(在我看来)


除非你要对数十亿个大字符串进行繁重的处理,否则我怀疑将它们存储在另一种(可能更节省空间)编码中是否有任何好处。此外,如果考虑IDN,即使URI也可以包含Unicode。因此,不要预先确定用户将向程序传递哪些数据。

在Windows API中,如果调用类似

int SomeFunctionA(const char*);
然后,它将自动将字符串转换为UTF-16,并调用函数的真实Unicode版本:

int SomeFunctionW(const wchar_t*);
问题是,它将字符串从ANSI代码页转换为UTF-16。如果您确实在ANSI代码页中对字符串进行了编码,那么这就可以了。如果字符串是用UTF-8编码的,这是行不通的,UTF-8现在越来越普遍(例如),而且不支持作为ANSI代码页

此外,如果使用
A
API,您将遇到一些限制,例如无法(轻松)打开名称中包含非ANSI字符的文件(可以是任意UTF-16字符串)。并且无法访问某些Windows


这就是为什么我总是调用
W
函数的原因。即使这意味着恼人的显式转换(来自我们软件中非Windows特定部分中使用的UTF-8字符串)。

A只是W版本的包装器
,据我所知,API函数只是扩展到
A
W
版本的宏(因此它们不是包装器)@Jesse:但是
A
函数本身大多只是
W
函数的包装。@dan04:我现在明白了,所以在内部,A函数只调用W函数就是答案的意思。谢谢。Jesse没有后缀的API函数只是宏,可以扩展为ApiCallA或ApiCallW,具体取决于您是处于ANSI模式还是Unicode模式(定义符号
Unicode
\u Unicode
,iirc)。但事实上,
ApiCallA
在将参数转换为Unicode后,只需将其委托给
ApiCallW
。Remy,我提出了一个观点,我认为现在的任何程序都不应该明确地将自己与Unicode隔离。几乎不考虑其目的