私の文字列には、日本語 (2 倍幅) と英語 (1 幅) の文字が混在しています。
string str = "女性love";
C# では、私のメソッドでは、日本語の文字を 2 つの列として、英語の文字を 1 つの列としてカウントする必要があります。上記の文字列が8列になるように:
2 + 2 + 1 + 1 + 1 + 1 = 8
私の文字列には、日本語 (2 倍幅) と英語 (1 幅) の文字が混在しています。
string str = "女性love";
C# では、私のメソッドでは、日本語の文字を 2 つの列として、英語の文字を 1 つの列としてカウントする必要があります。上記の文字列が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 のすべてのコード ポイントが 1 バイトに格納されます。コードポイント128以上のみが2、3、実際には最大6バイトを使用して格納されます
日本語の文字コード ポイントを確認すると、10 が返される理由がわかります。
編集
このコードは、実際には日本語の文字だけでなく、英語の文字を「その他」から分離していることに注意してください。日本語のみをフィルタリングする必要がある場合は、アラビア語、Ebraic、ロシア語などを処理する必要がある可能性があります。コードに関して、日本語のアルファベットの制限を知る必要があります。
よろしく。
次のようなことを試してください:
int bCnt = System.Text.Encoding.UTF8.GetBytes(str).Length; //Select the appropriate encoding, if not UTF8