首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转换宽字符的大小写,给定LCID (可视C++)

转换宽字符的大小写,给定LCID (可视C++)
EN

Stack Overflow用户
提问于 2012-01-10 21:19:30
回答 1查看 518关注 0票数 1

我有一些现有的可视化C++代码,我需要添加宽字符串的转换为大写或小写。

我知道这其中有一些陷阱(比如土耳其语的"I"),但是如果你了解这门语言,其中的大多数都可以解决。幸运的是,在这段代码中,我知道LCID值(locale ID),我想这与了解语言是一样的。

由于LCID是Windows类型,是否有Windows函数可以将宽字符串转换为大写或小写?

C运行时函数_towupper_l()听起来很理想,但它接受_locale_t参数,而不是LCID,所以我猜它不适合,除非有一种完全可靠的方法将LCID转换为_locale_t。

EN

回答 1

Stack Overflow用户

发布于 2013-02-08 02:57:19

您要搜索的函数名为LCMapString,它是Windows NLS API的一部分。LCMAP_UPPERCASE标志将字符映射为大写,而LCMAP_LOWERCASE将字符映射为小写。

对于针对Windows Vista和更高版本的应用程序,有一个an Ex variant可以在地区名称上工作,而不是在标识符上工作,这是微软现在说你应该更喜欢使用的。

事实上,在VS2010(可能还有其他版本)提供的CRT实现中,像_towupper_l这样的函数在从指定的_locale_t中提取区域设置ID (LCID)之后,最终会调用LCMapString

如果您像我一样不熟悉i8n API,那么您可能已经了解了CharUpperCharLowerCharUpperBuffCharLowerBuff系列函数。这些是Windows早期用于更改字符/字符串大小写的旧备用方法,但正如其文档所警告的那样:

请注意,CharXxx始终将大写i映射为小写i ("i"),即使当前语言是土耳其语或阿塞拜疆语。如果您需要一个在这方面对语言敏感的函数,请调用LCMapString

它忽略提到的是迈克尔·卡普兰关于国际化问题的精彩博客上的几篇文章:What does "linguistic casing" mean?How best to alter case。执行摘要是,您可以通过调用LCMapString而不指定LCMAP_LINGUISTIC_CASING标志来实现与CharXxx系列函数相同的结果,而您可以通过确保指定LCMAP_LINGUISTIC_CASING标志来对语言敏感。

示例代码:

代码语言:javascript
复制
std::wstring test("Does my code pass the Turkey test?");
if (!LCMapStringW(lcid,            /* your LCID, defined elsewhere */
                  LCMAP_UPPERCASE | LCMAP_LINGUISTIC_CASING,
                  test.c_str(),    /* input string */
                  test.length(),   /* length of input string */
                  &test[0],        /* output buffer (can reuse input) */
                  test.length()))  /* length of output buffer (same as input) */
{
   // Uh-oh! Something went wrong in the call to LCMapString, so you need to
   // handle the error somehow here.
   // A good start is calling GetLastError to determine the error code.
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8803891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档