.net 确定一个字符是否是变音字符?

.net 确定一个字符是否是变音字符?,.net,vb.net,character-encoding,character,diacritics,.net,Vb.net,Character Encoding,Character,Diacritics,我正在使用下一个函数转换变音字符,然后获取字符的键码,但是在调用此方法之前,我首先需要知道字符是否是变音字符,以避免在此方法上进行冗余调用,从而区分变音字符和非变音字符 那么,如何判断一个字符是否是变音的呢 注:请参阅代码中标记的Commos 其思想是,对于字符O,该方法应返回一个79,对于字符Ó,该方法将删除变音符号,因此我得到一个O,我再次调用该函数O,返回另一个79,但是如果在键盘布局上找不到该字符,则该方法将尝试删除变音符号,即使该字符不是变音符号,并始终再次调用相同的函数,因此我需要确

我正在使用下一个函数转换变音字符,然后获取字符的键码,但是在调用此方法之前,我首先需要知道字符是否是变音字符,以避免在此方法上进行冗余调用,从而区分变音字符和非变音字符

那么,如何判断一个字符是否是变音的呢

注:请参阅代码中标记的Commos

其思想是,对于字符
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标记。