2

私の文字列には、日本語 (2 倍幅) と英語 (1 幅) の文字が混在しています。

string str = "女性love";

C# では、私のメソッドでは、日本語の文字を 2 つの列として、英語の文字を 1 つの列としてカウントする必要があります。上記の文字列が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).Length10 を返すのかというと、単純にエンコード指定が原因UTF8です。このリンクJoel on Unicodeをたどって、記事全体を読んでください。特に、この質問に関して最も重要なものは次のとおりです。

UTF-8 では、0 ~ 127 のすべてのコード ポイントが 1 バイトに格納されます。コードポイント128以上のみが2、3、実際には最大6バイトを使用して格納されます

日本語の文字コード ポイントを確認すると、10 が返される理由がわかります。

編集

このコードは、実際には日本語の文字だけでなく、英語の文字を「その他」から分離していることに注意してください。日本語のみをフィルタリングする必要がある場合は、アラビア語、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 に答える