繁体   English   中英

在 C# 中检查字符串是半宽还是全宽

[英]Check if a string is half width or full width in C#

日语 Windows 操作系统上的 C# 应用程序 - 将拉丁语显示为全角字符

我在上面的链接中引用了接受的答案,并使用下面的代码将日语字符串从全宽转换为半宽,但它返回相同的全宽字符串而不进行转换。

string userInput = "チヨチヨチチヨチヨチ";
string result = userInput.Normalize(NormalizationForm.FormKC);

半宽的预期输出:チヨチヨチチヨチヨチ 实际输出:チヨチヨチチヨチヨチ(全宽)

然而,即使上面的代码应该将全角字符串转换为半角,当我将半角字符串 (チヨチヨチチヨチヨチ) 传递给上面的代码时,它会将其转换为全角形式 (チヨチヨチチヨチ) .

我在这里做错了什么?

无论如何,如果我的字符串已经是半角,我不希望执行上面的代码。

如何检查字符串是半宽还是全宽?

根据文档, normalize 方法按预期工作。 它必须将字符转换为标准字符,这样才能正确应用二进制比较。

但是,如果您想要一个始终将全角转换为半角的自定义转换,您可以创建一个字典来将全角字符映射到半角字符。 此链接可能有助于创建此地图。

如果您想确保字符串是半角的,那么如果它包含任何全角字符,则会被拒绝。 创建一个包含所有全角字符(拉丁语和日语)的字符串,然后在全角字符串中找到要测试的字符串的所有字符。

我为此编写了isHalfWidthString方法,并添加了全角到半角转换器方法。 我认为这可能会有所帮助:

    public class FullWidthCharactersHandler
    {
        static Dictionary<char, char> fullWidth2halfWidthDic;
        static FullWidthCharactersHandler()
        {
            fullWidth2halfWidthDic = new Dictionary<char, char>();
            string fullWidthChars = "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンッァィゥェォャュョ゙゚ー0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
            string halfWidthChars = "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンッァィゥェォャュョ゙゚ー0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
            for (int i = 0; i < fullWidthChars.Length; i++)
            {
                fullWidth2halfWidthDic.Add(fullWidthChars[i], halfWidthChars[i]);
            }
        }

        public static bool isHalfWidthString(string toTestString)
        {
            bool isHalfWidth = true;
            foreach (char ch in toTestString)
            {
                if (fullWidth2halfWidthDic.ContainsKey(ch))
                {
                    isHalfWidth = false;
                    break;
                }
            }
            return isHalfWidth;
        }

        public static string convertFullWidthToHalfWidth(string theString)
        {
            StringBuilder sbResult = new StringBuilder(theString);
            for (int i = 0; i < theString.Length; i++)
            {
                if (fullWidth2halfWidthDic.ContainsKey(theString[i]))
                {
                    sbResult[i] = fullWidth2halfWidthDic[theString[i]];
                }
            }
            return sbResult.ToString();
        }
    }

测试使用此链接

我更新了代码以使用Dictionary以获得更好的性能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM