2

我注意到,当从 MME 读取 MIDI 端口名称时,这些名称是使用 ANSI 代码页编码的多字节字符串,我的应用程序默认使用它。从 DirectMusic 驱动程序接收这些名称时,这些名称是使用 OEM 代码页编码的宽字符串。有关代码页的快速复习,请参阅Raymond Chen 的这篇文章。

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

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

有关信息:

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

2 回答 2

0

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

于 2009-07-13T04:34:15.067 回答
0

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

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

没有特定的 API 调用(据我所知)来找出框架将在哪个代码页中传递其字符串。但是,DirectMusic 似乎确实使用带有 OEM 代码页的双宽字符作为一般约定,尽管我找不到这在任何 MSDN 文档中都有明确说明。在关于 MIDI 端口能力结构的 MSDN DirectMusic 文档中,描述类型明确定义为 WCHAR,而游戏音频编程书似乎也表明这种类型是 API 范围的约定。虽然假设 OEM 是这些字符的默认编码是危险的,但我找不到任何其他说明(谷歌搜索“DirectMusic 代码页”现在将此页面列为热门)。

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

于 2009-07-09T19:02:48.107 回答