我试着检查使用winapi对A的重要性和理由,(W的意思是宽字符,A的意思是ascii,对吗?)
我做了一个简单的例子,我收到了当前用户的临时路径,如下所示:
CHAR pszUserTempPathA[MAX_PATH] = { 0 };
WCHAR pwszUserTempPathW[MAX_PATH] = { 0 };
GetTempPathA(MAX_PATH - 1, pszUserTempPathA);
GetTempPathW(MAX_PATH - 1, pwszUserTempPathW);
printf("pathA=%s\r\npathW=%ws\r\n",pszUserTempPathA,pwszUserTempPathW);我现在的用户有一个俄文名,所以它是用西里尔语写成的,输出如下:
pathA=C:\users\Пыщь\Local\Temp
pathW=C:\users\Пыщь\Local\Temp所以这两条路径都很好,我想我会收到一些错误,或者一个GetTempPathA的符号混乱,因为当前的用户是一个unicode,但是我发现,cyrillic字符实际上包含在扩展的ascii字符集中。因此,我有一个问题,如果我使用我的软件,它将在当前用户的临时文件夹中提取数据,该用户是中国人(假设他在用户名中有中文符号),使用GetTempPathA版本时,我会得到混乱还是错误?对于生产软件,我应该总是使用W前缀函数来直接使用winapi吗?
发布于 2018-03-19 16:07:36
当然,你需要宽版本。ASCII版本在技术上甚至不能处理超过256个不同的字符。Cyrillic包含在扩展的ASCII集合中(如果这是您的本地化的话),而中文不是,也不能是因为需要更大的字符集来表示它。此外,您也可以使用Cyrillic -只有在执行机器具有匹配的本地化时,它才能正常工作。因此,在具有非西里尔定位的机器上,文本将根据本地化设置定义的任何内容显示。
发布于 2018-03-19 17:20:39
首先,-A后缀代表ANSI,而不是ASCII。ASCII是一个7位字符集.正如微软所用的那样,ANSI是指使用8位代码单元(char)和代码页的编码。
有些人使用术语"extended“或"high”,但这实际上不是一个标准,在某些情况下,与ANSI不太一样。Extended是ASCII字符集加(最多)128个额外字符。对于许多ANSI代码页,这与扩展的ASCII相同,但有些代码页可以容纳可变长度的字符( Microsoft称之为多字节字符)。有些人认为“扩展的ASCII”只是指ISO-拉丁语-1(与Windows1252几乎相同)。
无论如何,使用ANSI函数,您的字符串可以包含当前代码页中的任何字符。如果您需要的字符不是您当前代码页的一部分,那么您就不走运了。您必须使用宽-W版本.
在Windows的现代版本中,您通常可以将-A函数看作-W函数的包装器,这些函数使用MultiByteToWideChar和/或WideCharToMultiByte来转换任何通过MultiByteToWideChar传递的字符串。但后一种转换可能是有损的,因为宽字符串可能包括您的多字节字符串无法表示的字符。
可移植的跨平台代码通常存储所有文本均为UTF-8,它使用8位代码单元(chars),但可以表示任何Unicode代码点,而且每当文本需要通过Windows时,您都会显式地转换到/从宽字符,然后调用API的-W版本。
UTF-8几乎类似于微软所谓的多字节ANSI代码页,只不过Windows并不完全支持UTF-8代码页。有CP_UTF8,但它只适用于某些API(如WideCharToMultiByte和MultiByteToWideChar)。您不能将代码页设置为CP_UTF8,并期望一般的-A API做正确的事情。
在尝试测试时,请注意,要获得CMD控制台窗口以显示当前代码页之外的字符是很困难的(有时也是不可能的)。如果您想要显示多脚本字符串,您可能应该编写一个GUI应用程序和/或使用调试器检查字符串的实际内容。
https://stackoverflow.com/questions/49367255
复制相似问题