【发布时间】:2016-09-19 03:46:44
【问题描述】:
好吧,基本上我要问的是:
假设我在启用 unicode 的路径上使用 PathFindFileNameA。我通过GetModuleFileNameA 获得了这个路径,但是由于这个api 不支持unicode 字符(例如意大利语字符),它会在系统路径的那部分输出垃圾字符。
假设x代表文件路径中的垃圾字符,如:
C:\Users\xxxxxxx\Desktop\myfile.sys
我假设PathFindFileNameA 只是用strtok 解析字符串,直到遇到最后一个\\,然后在给定str_length - pos_of_last \\ 的预分配缓冲区中输出剩余部分。
问题是,PathFindFileNameA 是否会正确解析字符串,即使它遇到来自失败的 unicode 转换的垃圾字符(因为调用了多字节 API 倒数),还是会使程序崩溃?
不要回答诸如“使用MultiByteToWideChar”或“使用广泛版本的API”之类的问题。我在问一个具体的问题,如果有具体的答案,我们将不胜感激。
谢谢!
【问题讨论】:
-
文档没有说你可以这样做,所以你应该认为它是不安全的。
-
@HarryJohnston 公平地说,文档并没有提及很多事情。但我会相信你的话。
-
系统使用 Unicode 数据。为什么你不能?你还支持 Windows 98 吗?
-
我不知道为什么你认为有人会建议你应该“使用
MultiByteToWideChar” 或“使用宽字符”。您的具体问题的答案是PathFindFileNameA将从这个损坏的 ANSI 字符串中返回"myfile.sys":"C:\Users\??????\Desktop\myfile.sys"?字符只是?字符,它可以替代无法表示的字符. -
您的问题包含太多不准确之处,无法回答。一方面,您的问题标题与您提出的问题不匹配。您的描述并不表明您的编码不匹配。 (此外,除了 UTF-32 之外,所有 Unicode 编码都是多字节的。)Microsoft 所称的 MBCS 可以对 ASCII 范围之外的字符进行编码。代码页 1252 (Latin 1) 确实包含意大利字符。不清楚您为什么认为
GetModuleFileNameA会输出 垃圾字符 - 它不会输出任何内容。