LCMapString

【勇芳软件工作室】汉化HomePreviousNext

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的字符串映射模式,则输出字符串只能为WCHARCHAR格式。如果使用由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字节是一个偶数位的字节,它将与之前的字节交换位置。

也可以看看

CompareString, FoldString, MAKELCID