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

Windows 如何将SAPI的MS LANG ID转换为BCP 47语言标记?,windows,sapi,lcid,Windows,Sapi,Lcid,对SAPI的get language方法的调用返回一个MS LangID,但出于我的目的,它需要转换为BCP 47语言标记,例如en GB。我们怎么做 我无法使用,因为要使用此函数,我需要先将返回值转换为LCID格式 例如,它返回809表示英语,现在我如何首先将其转换为LCID,因为LCIDHex表示英语是0809,LCIDec表示2057 任何帮助都将不胜感激 编辑:下面是代码 if (S_OK != SpEnumTokens(SPCAT_VOICES, NULL, NULL, &vo

对SAPI的get language方法的调用返回一个MS LangID,但出于我的目的,它需要转换为BCP 47语言标记,例如en GB。我们怎么做

我无法使用,因为要使用此函数,我需要先将返回值转换为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一样。

@HansPassant是正确的。你有一根绳子;将其解析为十六进制。使用或您最喜欢的解析器,然后传递到


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

LCID只是一个数字。如果你得到一个像809这样的字符串,那么你必须将它从十六进制表示转换为2057。当然,有很多方法可以做到这一点,这取决于你最喜欢的编程语言。你能添加你目前拥有的代码吗?这确实有效。谢谢但有一个问题。LCIDToLocaleName在windows xp上不可用。但是,我也需要在WinXP中这样做。我寻找其他的选择,但没有找到。那么,你知道我们如何在WinXP上做同样的事情吗?