如何将SAPI的MS LANG ID转换为BCP 47语言标签?

时间:2014-08-16 06:34:33

标签: windows sapi lcid

对SAPI的get语言方法的调用返回MS LangID,但出于我的目的,需要将其转换为BCP 47语言标记(例如,en-GB)。我们该怎么做呢?

我无法使用LCIDToLocalName来执行此操作,因为要使用此函数,我需要先将返回的值转换为LCID格式。

例如,它返回" 809"对于英语,现在如何将其转换为LCID,因为英语的LCIDHex是" 0809",而LCIDec是" 2057"。

任何帮助都将不胜感激。

编辑:以下是代码

if (S_OK != SpEnumTokens(SPCAT_VOICES, NULL, NULL, &voice_tokens))
    return FALSE;

unsigned long voice_count, i = 0;
hr = voice_tokens->GetCount(&voice_count);
cout << " count " << voice_count << endl;
for (unsigned int i = 0; i < voice_count; i++){
    //cout << i << endl;
    CComPtr<ISpObjectToken> voice_token;
    if (S_OK != voice_tokens->Next(1, &voice_token, NULL))
        return FALSE;

    WCHAR *description;
    if (S_OK != SpGetDescription(voice_token, &description))
        return FALSE;


    CComPtr<ISpDataKey> attributes;
    if (S_OK != voice_token->OpenKey(kAttributesKey, &attributes))
        return FALSE;

    WCHAR *gender_s;
    TtsGenderType gender;
    if (S_OK == attributes->GetStringValue(kGenderValue, &gender_s)){
        if (0 == _wcsicmp(gender_s, L"male"))
            gender = TTS_GENDER_MALE;
        else if (0 == _wcsicmp(gender_s, L"female"))
            gender = TTS_GENDER_FEMALE;
    }


    WCHAR *language;
    if (S_OK != attributes->GetStringValue(kLanguageValue, &language))
        return FALSE;

    wprintf(L"%s\n", language);

最后一行打印十六进制值,例如409和809,但我希望它的格式类似于En-US。

1 个答案:

答案 0 :(得分:0)

@HansPassant是正确的。你有一个字符串;将其解析为十六进制。使用_wtoi(或您最喜欢的解析器),然后转到LCIDToLocaleName

对于XP,您可以使用DownlevelLCIDToLocaleName;可以从Microsoft Download Center下载所需的DLL。