【问题标题】:how to convert SAPI's MS LANG ID to BCP 47 language tag?如何将 SAPI 的 MS LANG ID 转换为 BCP 47 语言标签?
【发布时间】:2014-08-16 06:34:32
【问题描述】:

对 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 这样的格式。

【问题讨论】:

  • LCID 只是一个数字。如果你得到一个像“809”这样的字符串,那么你必须将它从它的十六进制表示转换,这样你就得到了 2057。很多方法可以做到这一点,当然取决于你最喜欢的编程语言。
  • 可以添加你目前拥有的代码吗?

标签: windows sapi lcid


【解决方案1】:

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

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

【讨论】:

  • 确实有效。谢谢。但是有一个问题。 LCIDToLocaleName 在 windows xp 上不可用。但是,我也需要在 win xp 中执行此操作。我搜索了替代品,但找不到。那么,知道我们如何在 win xp 上做同样的事情吗?
猜你喜欢
  • 1970-01-01
  • 2018-08-12
  • 2012-03-08
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多