2

我的字符串包含日文(双宽)和英文(单宽)字符的混合:

string str = "女性love";

在 C# 中,我的方法必须将日文字符计为两列,将英文字符计为一列。所以上面的字符串应该给我一个 8 列:

2 + 2 + 1 + 1 + 1 + 1 = 8
4

2 回答 2

3

可能你想要这样的东西,非常粗糙,但通过稍微努力,你可以让它变得更好:

    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、俄语或其他任何内容,您需要了解日语字母的代码限制

问候。

于 2011-07-26T19:53:59.323 回答
2

尝试这样的事情:

int bCnt = System.Text.Encoding.UTF8.GetBytes(str).Length; //Select the appropriate encoding, if not UTF8
于 2011-07-26T19:33:00.123 回答