.net 确定一个字符是否是变音字符?
我正在使用下一个函数转换变音字符,然后获取字符的键码,但是在调用此方法之前,我首先需要知道字符是否是变音字符,以避免在此方法上进行冗余调用,从而区分变音字符和非变音字符 那么,如何判断一个字符是否是变音的呢 注:请参阅代码中标记的Commos 其思想是,对于字符.net 确定一个字符是否是变音字符?,.net,vb.net,character-encoding,character,diacritics,.net,Vb.net,Character Encoding,Character,Diacritics,我正在使用下一个函数转换变音字符,然后获取字符的键码,但是在调用此方法之前,我首先需要知道字符是否是变音字符,以避免在此方法上进行冗余调用,从而区分变音字符和非变音字符 那么,如何判断一个字符是否是变音的呢 注:请参阅代码中标记的Commos 其思想是,对于字符O,该方法应返回一个79,对于字符Ó,该方法将删除变音符号,因此我得到一个O,我再次调用该函数O,返回另一个79,但是如果在键盘布局上找不到该字符,则该方法将尝试删除变音符号,即使该字符不是变音符号,并始终再次调用相同的函数,因此我需要确
O
,该方法应返回一个79
,对于字符Ó
,该方法将删除变音符号,因此我得到一个O
,我再次调用该函数O
,返回另一个79
,但是如果在键盘布局上找不到该字符,则该方法将尝试删除变音符号,即使该字符不是变音符号,并始终再次调用相同的函数,因此我需要确定该字符是否是变音符号
Public Shared Function GetKeyCode(ByVal Character As Char,
Optional ByVal KeyboardLayout As IntPtr = Nothing) As Short
' Get the Keycode of the character.
Dim Keycode As Short =
BitConverter.GetBytes(VkKeyScanEx(Character)).First
Select Case Keycode
Case Is <> 255 ' Character is found on the current KeyboardLayout.
Return Keycode
Case Else ' Character is not found on the current layour (Maybe is a diacritic character?)
' ****************************************************************************
' I want to perform the instructions below only if the character is diacritic.
' ****************************************************************************
Dim s As String = CStr(Character).Normalize(System.Text.NormalizationForm.FormKD)
For Each c As Char In s
Select Case Globalization.CharUnicodeInfo.GetUnicodeCategory(c)
Case Globalization.UnicodeCategory.NonSpacingMark,
Globalization.UnicodeCategory.SpacingCombiningMark,
Globalization.UnicodeCategory.EnclosingMark
' Do nothing.
Exit Select
Case Else ' Character is diacritic so we remove the diacritic and try to return the Keycode.
Return GetKeyCode(c, KeyboardLayout)
End Select
Next c
' ****************************************************************************
' I want to perform the instructions above only if the character is diacritic.
' ****************************************************************************
Return 255 ' Character is not diacritic and the keycode can't be found.
End Select
公共共享函数GetKeyCode(ByVal字符作为Char,
可选ByVal键盘布局为IntPtr=无)为短
'获取角色的键代码。
Dim Keycode为短码=
BitConverter.GetBytes(VkKeyScanEx(字符)).First
选择大小写键代码
在当前键盘布局上找到大小写为255'的字符。
返回键码
当前布局中找不到Case Else的字符(可能是变音字符?)
' ****************************************************************************
'我只想在字符为变音符号时执行以下说明。
' ****************************************************************************
Dim s As String=CStr(字符).Normalize(System.Text.NormalizationForm.FormKD)
对于每个c作为s中的字符
选择Case Globalization.CharUnicodeInfo.getUnicodeCegory(c)
案例全球化.Unicodegory.NonSpacingMark,
全球化.Unicodegory.SpacingCombiningMark,
Globalization.unicode.decategory.EnclosingMark
“什么也不做。
退出选择
Case Else的字符是变音符号,因此我们删除变音符号并尝试返回键码。
返回GetKeyCode(c,键盘布局)
结束选择
下一个c
' ****************************************************************************
'我只想在字符是变音符号时执行上面的说明。
' ****************************************************************************
Return 255'字符不是变音字符,找不到键码。
结束选择
要想知道宪章是否是变音符号,安全的办法是测试它
一种选择是遍历所有Unicode一次,并将变音符号放入哈希集中
如果您正在测试一个长字符串,那么将整个字符串规范化一次
如果你想要一个更广泛的映射,考虑到Win 1252.
也要定义“diACCORE”。字符“Ó”(U+00D3拉丁文大写字母O,带锐音符)在任何正常定义下都不是变音符号。它可以被描述为包含一个变音符号。但代码似乎规范化为规范化形式的KD,KD将“Ó”分解为“O”,并进行组合。那么问题出在哪里?@Jukka K.Korpela我找到了计算描述字符数组长度的方法,谢谢你的帮助。我指的是变调的markBad计划。不只是diaCasic分解-考虑1/2和1/4。@ BLAM是的,我会纠正,我发现这不是100%的效率,我对所有的建议/解决方案开放,谢谢评论澄清,当我说diaCiple,我说diaCiric和diaRICIC标记。