LCMapString函数将一个字符串映射到另一个字符串,执行指定的区域设置相关转换。该函数也可用于为输入字符串生成排序键。
int LCMapString(
LCID 【语言环境】, | //确定地方 |
DWORD 【dwMapFlags】, | //映射转换类型 |
LPCTSTR 【lpSrcStr】, | //源字符串的地址 |
INT 【cchSrc】, | //源字符串中的字符数 |
LPTSTR 【lpDestStr】, | //目的缓冲区的地址 |
INT 【cchDest】 | //目标缓冲区大小 |
); |
参数
【语言环境】
指定区域设置标识符。语言环境为字符串映射或排序键生成提供了一个上下文。应用程序可以使用MAKELCID宏创建区域设置标识符。
【dwMapFlags】
一组标志,指示在字符串映射或排序关键字生成期间要使用的转换类型。应用程序可以在单个转换中指定多个选项,但某些组合无效。定义了以下映射选项;下表中注明的限制:
选项 | 含义 |
LCMAP_BYTEREV | 仅Windows NT:使用字节反转。例如,如果您传入0x3450 0x4822,则结果为0x5034 0x2248。 |
LCMAP_FULLWIDTH | 将单字节字符映射到双字节字符。 |
LCMAP_HALFWIDTH | 将双字节字符映射到单字节字符。 |
LCMAP_HIRAGANA | 将双字节片假名字符映射到双字节平假名字符。 |
LCMAP_KATAKANA | 将双字节平假名字符映射到双字节片假名字符。 |
LCMAP_LOWERCASE | 使用小写。 |
LCMAP_SORTKEY | 生成一个标准化的宽字符排序键。 |
LCMAP_UPPERCASE | 使用大写。 |
NORM_IGNORECASE | 忽略病例。 |
NORM_IGNOREKANATYPE | 不要区分平假名和片假名人物。相应的平假名和片假名将比较平等。 |
NORM_IGNORENONSPACE | 忽略无偏见。此标志也会删除日语重音字符。 |
NORM_IGNORESYMBOLS | 忽略符号。 |
NORM_IGNOREWIDTH | 不要区分单字节字符和与双字节字符相同的字符。 |
SORT_STRINGSORT | 将标点符号与符号相同。 |
如果指定了 LCMAP_SORTKEY标志不是,则LCMapString功能将执行字符串映射。在这种情况下,适用以下限制:
* LCMAP_LOWERCASE和LCMAP_UPPERCASE是互斥的。
* LCMAP_HIRAGANA和LCMAP_KATAKANA是相互排斥的。
* LCMAP_HALFWIDTH和LCMAP_FULLWIDTH是互斥的。
* SORT_STRINGSORT,NORM_IGNOREKANATYPE,NORM_IGNOREWIDTH和NORM_IGNORECASE无效。
* LCMAP_LOWERCASE和LCMAP_UPPERCASE与以下任何标志无效:LCMAP_HIRAGANA,LCMAP_KATAKANA,LCMAP_HALFWIDTH和LCMAP_FULLWIDTH。
指定LCMAP_SORTKEY标志is时,LCMapString函数生成一个排序键。在这种情况下,适用以下限制:
*所有LCMAP_ *选项无效,LCMAP_BYTEREV除外。换句话说,LCMAP_SORTKEY与所有其他LCMAP_ *标志相互排斥,唯一的例外是LCMAP_BYTEREV。LCMAP_BYTEREV仅适用于Windows NT。
【lpSrcStr】
指向功能映射或用于排序键生成的源字符串的指针。
【cchSrc】
指定【lpSrcStr】参数指向的字符串中的字节数(ANSI版本)或字符(Unicode版本)。
这个计数可以包括NULL终止符,或者不包括它。如果NULL终止符包含在字符计数中,则它不会极大地影响映射行为。这是因为NULL被认为是不可转换的,并且总是映射到自身。
值为-1的【cchSrc】表示【lpSrcStr】指向的字符串为空终止。如果是这种情况,并且LCMapString在其字符串映射模式下被使用,则该函数计算字符串的长度本身,并且将终止映射的字符串存储到* 【lpDestStr】中。
【lpDestStr】
指向存储映射字符串或排序键的缓冲区的指针。
如果指定了LCMAP_SORTKEY,则LCMapString将一个排序键存储到缓冲区中。排序键以以下格式存储为字节值数组:
[all Unicode sort weights] 0x01 [all Diacritic weights] 0x01 [all Case weights] 0x01 [all Special weights] 0x00
请注意,排序键为空终止。无论【cchSrc】的价值如何,都是如此。另请注意,即使某些排序权重不在排序键中,由于【dwMapFlags】中存在一个或多个忽略标志,0x01分隔符和0x00终止符仍然存在。
【cchDest】
指定由【lpDestStr】指向的缓冲区的字节大小(ANSI版本)或字符(Unicode版本)。
如果函数用于字符串映射,则大小是字符数。如果【cchSrc】中包含NULL终止符的空间,则【cchDest】还必须包含NULL终结符的空间。
如果该函数用于生成排序键,则大小为字节数。此字节计数必须包含排序键0x00终止符的空格。
如果【cchDest】为零,则函数的返回值为字符数,或者如果指定了LCMAP_SORTKEY,则为保持映射字符串或排序键所需的字节数。在这种情况下,不使用【lpDestStr】指向的缓冲区。
返回值
如果函数成功,并且【cchDest】的值不为零,则返回值为写入缓冲区的字符数,或指定了LCMAP_SORTKEY的字节数。这个计数包括一个NULL终结符的空间。
如果函数成功,并且【cchDest】的值为零,则返回值是以字符为单位的缓冲区大小,如果指定了LCMAP_SORTKEY,则返回值是接收转换的字符串或排序键所需的值。这个大小包括一个NULL终结符的空间。
如果函数失败,返回值为0。要获取扩展错误信息,请调用GetLastError.GetLastError可能会返回以下错误代码之一:
ERROR_INSUFFICIENT_BUFFER
ERROR_INVALID_FLAGS
ERROR_INVALID_PARAMETER
备注
如果源字符串为空终止,则映射的字符串为空终止。
此函数的A版本根据指定的LCID的默认ANSI代码页将字符串映射到Unicode或从Unicode映射。
如果指定LCMAP_HIRAGANA标记将片假名字符映射到平假名字符,并且未指定LCMAP_FULLWIDTH,则该函数仅将全角字符映射到平假名。在这种情况下,任何半角片假名字符都按原样放置在输出字符串中,而不映射到平假名。如果想要将半角片假名字符映射到平假名,应用程序必须指定LCMAP_FULLWIDTH。
【lpSrcStr】和【lpDestStr】指针不能相同。如果它们相同,则该函数失败,并且GetLastError返回ERROR_INVALID_PARAMETER。
即使调用此函数的宽字符Unicode版本,如果使用LCMapString的字符串映射模式,则输出字符串只能为WCHAR或CHAR格式。如果使用由LCMAP_SORTKEY指定的排序密钥生成模式,则输出是字节值的数组。应用程序可以使用逐字节比较来比较排序键。
应用程序可以调用NORM_IGNORENONSPACE和NORM_IGNORESYMBOLS标志设置的函数,并清除所有其他选项标志,以便简单地从输入字符串中删除字符。如果这是使用非空终止的输入字符串完成的,则LCMapString可能返回一个空字符串,而不返回错误。
LCMapString功能忽略了阿拉伯语Kashida。如果应用程序调用该函数为包含阿拉伯语Kashida的字符串创建排序键,则Kashida将不会有排序键值。
该函数对连字符和撇号与其他标点符号有一点不同,以便像coop和co-op这样的词语保持在列表中。除连字符和撇号之外的所有标点符号在字母数字字符前排序。应用程序可以通过设置SORT_STRINGSORT标志来更改此行为。有关此问题的更详细的讨论,请参阅CompareString .
当LCMapString用于生成排序键时,通过设置LC_MAPSORTKEY标志,存储在* 【lpDestStr】中的排序键可能包含奇数个字节。LCMAP_BYTEREV选项(仅限Windows NT)仅反转偶数个字节。如果选择了两个选项,则排序键中的最后(奇数位)字节不会相反。如果终止的0x00字节是一个奇数位字节,那么它仍然是排序键中的最后一个字节。如果终止的0x00字节是一个偶数位的字节,它将与之前的字节交换位置。
也可以看看