C# application on Japanese Windows OS - Present Latin as Full-Width characters
我在上面的链接中引用了接受的答案,并使用下面的代码将日语字符串从全宽转换为半宽,但它返回相同的全宽字符串而不进行转换。
string userInput = "チヨチヨチチヨチヨチ";
string result = userInput.Normalize(NormalizationForm.FormKC);预期输出(半宽):チヨチヨチチヨチヨチ实际输出:チヨチヨチチヨチヨチ(全宽)
但是,尽管上面的代码应该将全角字符串转换为半角字符串,但当我将半角字符串(チヨチヨチチヨチヨチ)传递给上面的代码时,它会将其转换为全角形式(チヨチヨチチヨチヨチ)。
我在这里做错了什么?
不管怎样,如果我的字符串已经是半角的,我不希望上面的代码被执行。
如何检查字符串是半角还是全角?
发布于 2019-07-22 18:58:33
根据this文档,normalize方法按预期工作。它必须将字符转换为标准字符,这样才能正确应用二进制比较。
但是,如果您希望自定义转换始终将全角转换为半角,则可以创建一个Dictionary来将全角字符映射到半角字符。This link可能对创建此映射很有帮助。
如果您想要确保字符串是半角的,那么如果它包含任何全角字符,它就会被拒绝。创建一个包含所有全角字符(拉丁语和日语)的字符串,然后在全角字符串中查找要测试的字符串的所有字符。
为此,我编写了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();
}
}对于测试,使用this link。
我更新了代码以使用Dictionary以获得更好的性能。
https://stackoverflow.com/questions/57142760
复制相似问题