使用 MME 和 DirectMusic 时的 ANSI 或 OEM 代码页?

发布于 2024-07-26 11:03:48 字数 1081 浏览 15 评论 0原文

我注意到,当从 MME 读取 MIDI 端口名称时,这些名称是使用 ANSI 代码页编码的多字节字符串,我的应用程序默认使用该代码页。 从 DirectMusic 驱动程序接收这些名称时,这些名称是使用 OEM 代码页编码的宽字符串。 请参阅Raymond Chen 撰写的这篇文章进行快速回顾在代码页上。

在我的德语系统上,这意味着当使用当前代码页(结果是 ANSI 代码页)时,我会从 MME 获得“Audiogerät”,并从 DirectMusic 获得“Audiogeröt”,后者是错误的。 当我将姓氏视为 OEM 编码时,这个问题就得到了解决。

那么我如何知道使用哪个代码页来解码这些名称呢? 为什么来自 DirectMusic 的名称编码不同? 它来自 USB 驱动程序吗? COM框架? 直接音乐? 如何确定在读取 MIDI 端口名称时使用哪个代码页?

有关信息:

  • 我使用 MultiByteToWideChar()WideCharToMultiByte()< /code> 函数来执行转换,并使用 CP_ACPCP_OEMCP 作为要使用的代码页的参数。
  • 我使用 midiInGetDeviceCaps() 从 MME 子系统获取 MIDI 端口信息......
  • 并使用 CP_ACP 转换 MIDIINCAPS.szPname ( ANSI)代码页。
  • 我使用 IID_IDirectMusic8::EnumPort() 从 DirectMusic 获取端口信息...
  • ...并使用 CP_OEMCP 代码页转换 DMUS_PORTCAPS.wszDescription

I noticed that when reading MIDI port names from MME, the names are multi-byte strings encoded using the ANSI Codepage, which my app uses by default. When receiving those names from the DirectMusic driver, the names are wide-character strings encoded with the OEM Codepage. See this article by Raymond Chen for a quick refresher on Codepages.

On my German system, this means that when using the current codepage, which turns out to be the ANSI one, I get "Audiogerät" from MME, and "Audiogeröt" from DirectMusic, the latter being wrong. This gets fixed when I treat that last name as OEM-encoded instead.

So how do I know with which codepage to decode those names? Why does the name coming from DirectMusic get encoded differently? Does it come from the USB driver? The COM framework? DirectMusic? How can I know for sure which codepage to use when reading the names of my MIDI ports?

For info:

  • I use the MultiByteToWideChar() and WideCharToMultiByte() functions to perform the conversions, with CP_ACP and CP_OEMCP as argument for the codepage to use.
  • I use midiInGetDeviceCaps() to get MIDI port information from the MME subsystem...
  • ... and convert MIDIINCAPS.szPname using the CP_ACP (ANSI) codepage.
  • I use IID_IDirectMusic8::EnumPort() to get port information from DirectMusic...
  • ... and convert DMUS_PORTCAPS.wszDescription using the CP_OEMCP codepage.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

酒中人 2024-08-02 11:03:48

我不确定为什么 DirectMusic 框架会使用一组代码页,而 MME 会使用另一组代码页,但您这边的解决方案可能是构建一个抽象层,然后为每个 API 进行特定的实现。 这样,更高级别的软件就不需要关心这样的细节。

也就是说,端点名称肯定来自操作系统。 USB MIDI 设备仅指定端点类型(即输入或输出以及数量),但操作系统可以根据需要自由解释它们,这就是它们被本地化的原因。

没有特定的 API 调用(据我所知)来找出框架将在哪个代码页中传递其字符串。但是,DirectMusic 似乎确实使用带有 OEM 代码页的双宽字符作为一般约定,尽管我找不到这在任何 MSDN 文档中都有明确说明。 在 有关 MIDI 端口功能结构的 MSDN DirectMusic 文档,说明类型明确定义为 WCHAR,并且

编辑:查看此有关确定当前操作系统代码页的 stackoverflow 问题。 DirectMusic API 可能以这种方式设置代码页。

I don't know for sure why the DirectMusic framework would use one set of codepages, and MME another, but the solution here on your end is probably to build an abstraction layer and then make specific implementations for each API. That way, the higher levels of your software don't need to concern itself with details like this.

That said, the endpoint names definitely come from the OS. USB MIDI devices specify only endpoint types (ie, either input or output, and the number), but the OS is free to interpret them as it sees fit, which is why they are localized.

There is not a specific API call (as far as I know) to find out which codepage the framework will deliver its strings in. However, DirectMusic does seem to use double wide characters with OEM codepage as a general convention, though I could not find this clearly stated in any of the MSDN docs. In the MSDN DirectMusic documentation about MIDI port capability structures, the description type clearly is defined as a WCHAR, and the Game Audio Programming book seems to also indicate that this type is an API-wide convention. While it's dangerous to assume that OEM is the default encoding for these chars, I can't find anything that says otherwise (and googling for "DirectMusic codepage" now lists this page as the top hit).

Edit: Check out this stackoverflow question on determining the current OS codepage. It is possible that the DirectMusic API sets the codepage in this manner.

五里雾 2024-08-02 11:03:48

实际上并没有一种自动方法来告诉这些类型的数据使用什么代码页。 请参阅此处:如何检测文本文件的编码/代码页

There isn't really an automatic way to tell what codepage is used for these types of data. See here: How can I detect the encoding/codepage of a text file

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文