我的字符串包含日语(双倍宽度)和英语(单宽)字符的混合:
string str = "女性love";
在C#中,我的方法必须将日文字符计为两列,将英文字符计为一列。 所以上面的字符串应该给我一个8列:
2 + 2 + 1 + 1 + 1 + 1 = 8
答案 0 :(得分:3)
Probbaly你想要这样的东西,非常粗糙的东西,但通过稍微努力,你可以使它更好:
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
ecoding规范。请点击此链接Joel on Unicode并阅读整篇文章。特别是这里有关于这个问题的最重要的东西:
在UTF-8中,0-127的每个代码点都存储在一个字节中。 仅使用2,3存储代码点128及以上,实际上最多为6 字节
检查您的日语字母代码点,然后您将找出为什么它返回10的aswer。
修改强>
请注意,此代码实际上将英文字母与“其他”分开,而不是仅从日文字母。如果你只需要过滤日语,可能需要处理阿拉伯语,Ebraic,俄语或其他什么,你需要知道 limits ,在代码方面,日语字母。
问候。
答案 1 :(得分:2)
尝试这样的事情:
int bCnt = System.Text.Encoding.UTF8.GetBytes(str).Length; //Select the appropriate encoding, if not UTF8