C++ 将C+中的宽字符字符串转换为小写字符+;

C++ 将C+中的宽字符字符串转换为小写字符+;,c++,lowercase,widestring,C++,Lowercase,Widestring,该字符串包含日语、汉语、德语和希腊语的混合字符 我想用towlower 。。但文件上说: towlower的大小写转换是特定于语言环境的。只有与当前区域设置相关的字符才会在大小写中更改 编辑:也许我应该描述一下我在做什么。我收到一个用户的Unicode搜索查询。它最初采用UTF-8编码,但我正在将其转换为widechar(我可能在措辞上有误)。我的调试器(VS2008)在“变量快速监视”中正确显示日语、德语等字符。我需要遍历另一组Unicode数据,并找到搜索字符串的匹配项。当搜索区分大小写时

该字符串包含日语、汉语、德语和希腊语的混合字符

我想用towlower

。。但文件上说:

towlower的大小写转换是特定于语言环境的。只有与当前区域设置相关的字符才会在大小写中更改


编辑:也许我应该描述一下我在做什么。我收到一个用户的Unicode搜索查询。它最初采用UTF-8编码,但我正在将其转换为widechar(我可能在措辞上有误)。我的调试器(VS2008)在“变量快速监视”中正确显示日语、德语等字符。我需要遍历另一组Unicode数据,并找到搜索字符串的匹配项。当搜索区分大小写时,这对我来说并没有问题,但不区分大小写的问题更大。我(可能是天真的)解决问题的方法是将所有输入数据和输出数据转换为小写,然后进行比较。

您手头有一个棘手的问题。日语区域设置无助于转换德语,反之亦然。有些语言也没有大写的概念(
toupper
和friends,我想在这里是不允许的)。那么,你能把你的字符串分成来自同一种语言的单个词块吗?如果可以,则可以转换片段并将其串起来。

如果字符串包含所有这些字符,则代码集必须基于Unicode。如果实现正确,(第4章“”)将定义字符属性,包括字符是否为大写和小写映射,等等


鉴于该序言,来自
towlower()
函数是正确的使用工具。如果它不能完成这项工作,那么您需要与供应商讨论QoI(实施质量)问题。如果您发现供应商没有响应,请查看其他库。在这种情况下,您可以考虑(Unicode的国际组件)。

演示如何使用小面来处理几个区域。如果是Windows,可以考虑使用Win32 API函数,如果您可以使用C++(.NET托管C++),可以使用<代码> char。ToLower < /Code >和<代码>字符串。ToLower < /Code >函数,这些代码是Unicode兼容的。

< P>查看<代码> < WCsWRWLL <代码> <代码>()
您应该能够在每个地区的输入上运行该函数。

日语和东亚其他表意语言是主要没有大写字母的语言示例。不仅如此,个别语言对特定字母的大写/小写方式可能有不同的意见。在不了解语言的情况下,没有一种算法可以在任意Unicode字符串上正确地执行此操作。尽管我同意这种评估,Unicode包括独立于语言环境的大小写属性,其用法在3.13“默认大小写操作”中描述,在没有为特定语言量身定制的情况下使用,所以标准说,确实如此。问题是,比如说,99%的情况下它是正确的,但你会得到1%的错误。这可能是个问题,也可能不是。一般来说,当你把它用于代码中的标识符,甚至是文件名时,它已经足够好了。@Pavel:这意味着你不能一直做对,但你可以一直做对。我知道在土耳其语中,将“I”小写为“I”是错误的,但是如果您只是规范化字符串以进行比较,而不是打印结果,那么它可能工作得很好。您链接到的文档中指定的Unicode大小写映射仍然部分依赖于区域设置。Quote:“SpecialCasing.txt-包含映射到多个字符的其他大小写映射,如“ß”到“SS”。还包含上下文相关映射,带有标志以区分它们与普通映射,以及一些区域设置相关映射。”。因此,
tolower
无法避免特定于区域设置。@Pavel此过程称为“Unicode字符串的规范化”,它确保
ß
ss
被同等对待(取决于所选的规范化形式),Unicode包含语言无关的算法,但不要忽略对区域设置或特定于应用程序的处理。@Abel:规范化不是一个完整的解决方案。例如,在一些拉丁语中,变音符号消失在大写字母上,而在其他语言中则没有。除非你知道这篇文章是用哪种语言写的,否则没有办法说出来。当然,还有一个臭名昭著的土耳其语无圆点的“i”问题——你想让土耳其语的
i
小写为
i
i
小写为
i
,但你想让任何其他拉丁字母语言的
i
小写为
i
。@Pavel:这是一个很好的阐述,我完全同意。不,规范化不是完美的,它更像是一种简单的暴力方法,但它在很多情况下都有帮助。在讨论中加入一个指向Unicode排序算法的链接可能是一个好时机,该算法全面讨论了这一点(比小写/大写更深入):Unicode大小写映射:@JonathanLeffler:ICU很有趣,但可能有些过火。我可能会处理unicodata.txt[编译成二进制并过滤掉不相关的部分]。另一种方法是使用忽略大小写的比较算法。案件不是你唯一的问题。例如,在不规范字符串的情况下,可以将变音符号视为一个字符(
é
Õ
)或几个单独字符(
'e
~O
)的一部分。在你的情况下,比较前适当的标准化(NFC/NFD/NFKC/NFKD)是至关重要的。Abel,请将其作为正确的答案发布,以便可以按原样向上投票。这几乎是唯一的公司