【问题标题】:Will program crash if Unicode data is parsed as Multibyte?如果 Unicode 数据被解析为多字节,程序会崩溃吗?
【发布时间】: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 会输出 垃圾字符 - 它不会输出任何内容。

标签: c winapi unicode


【解决方案1】:

为什么你认为 Windows API 只做 strtok?以前听说在win10发布之前,所有的xxA API都会重定向到xxW API。

我认为这个问题的答案很简单。只需编写一个简单的程序,然后将代码页设置为您想要的。运行该程序,答案就出来了。

P.S.:我个人认为 GetModuleFileNameA 即使有垃圾字符也能正常工作,因为 Windows 会在内部将图像名称存储为 UNICODE_STRING。即使你使用 MBCS,垃圾代码也不包含零字节,它会照常工作,因为它只是使用 strncpy。

对不起我的最后一个答案:)

【讨论】:

  • 呃,Windows 10 发生了什么变化?他们最终消除了 ANSI API 吗?此外,个别程序不设置自己的代码页。如果您调用 ANSI API,您将获得系统代码页。
  • @CodyGray 在 Win10 之前,我们可以简单地在 Unicode API 上设置断点。但是听说在win10下,这个招就不行了。很多人认为这些 ANSI 系列 API 最终会分离。
  • @cod:从 Windows 10 1903 开始​​,微软似乎正在重新利用 ANSI API 来引入 UTF-8 支持。Use the UTF-8 code page 对此有一些暗示。我没有关于如何在内部实施的信息。内核本身不太可能理解 UTF-8,所以我假设仍然涉及转换。
猜你喜欢
  • 2011-01-31
  • 1970-01-01
  • 2012-05-31
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多