我的字符串包含日文(双宽)和英文(单宽)字符的混合:
string str = "女性love";
在 C# 中,我的方法必须将日文字符计为两列,将英文字符计为一列。所以上面的字符串应该给我一个 8 列:
2 + 2 + 1 + 1 + 1 + 1 = 8
我的字符串包含日文(双宽)和英文(单宽)字符的混合:
string str = "女性love";
在 C# 中,我的方法必须将日文字符计为两列,将英文字符计为一列。所以上面的字符串应该给我一个 8 列:
2 + 2 + 1 + 1 + 1 + 1 = 8
可能你想要这样的东西,非常粗糙,但通过稍微努力,你可以让它变得更好:
string str = "女性love";
int iTotal = 0;
str.ToList().ForEach(ch=>{
int iCode = ch;
if(iCode>= 65 && iCode <= 122)
iTotal++;
else
iTotal +=2;
});
//65 is 'a', 122 is 'z'. iTotal = 8 //in this case
现在为什么 System.Text.Encoding.UTF8.GetBytes(str).Length
返回 10 呢,它只是导致UTF8
编码规范。按照这个链接Joel on Unicode阅读整篇文章。特别是关于这个问题,这是最重要的东西:
在 UTF-8 中,从 0 到 127 的每个代码点都存储在一个字节中。只有码位128及以上使用2、3存储,其实最多6个字节
检查您的日文字母代码点,您将弄清楚为什么它返回 10。
编辑
请注意,此代码实际上将英文字母与“others”分开,而不仅仅是日文字母。如果您只需要过滤日语,原因可能是您需要处理阿拉伯语、Ebraic、俄语或其他任何内容,您需要了解日语字母的代码限制。
问候。
尝试这样的事情:
int bCnt = System.Text.Encoding.UTF8.GetBytes(str).Length; //Select the appropriate encoding, if not UTF8