月度归档:2015年06月

使用MLang API检测窄字符串编码

做播放器时一般人多多少少都会遇到点字符乱码的问题,这些乱码基本都是出在mp3等老旧的格式上。这大概都是因为这些音频文件使用不遵循编码标准的软件制作而成。解决方法似乎也不怎么好(至少我的乱码mp3没有办法解决),不过MLang API作为Windows系统自带的API(Universal App可用)是非常方便好用的窄字符串编码检测方式,特定情况下非常好用。

使用方法非常简单:

#include <MLang.h>

HRESULT DetectCodepage(char* text, int* codePage) {
    IMultiLanguage2* iml;
    HRESULT hr = CoCreateInstance(CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER, IID_IMultiLanguage2, (LPVOID*)&iml);
    if (SUCCEEDED(hr)) {
        DetectEncodingInfo info;
        int size = strlen(text) + 1, cnt = 1;
        hr = iml->DetectInputCodepage(0, 0, text, &size, &info, &cnt);
        if (SUCCEEDED(hr)) {
            *codePage = info.nCodePage;
            iml->Release();
            return S_OK;
        }
    }
    return hr;
}

获得Code Page之后就可以用MultiByteToWideChar之类的API将窄字符转换为宽字符了。
其他相关内容可以参考MSDN: https://msdn.microsoft.com/en-us/library/aa741220(v=vs.85).aspx