例えば、
あaaaあ
という文字列があったとします。
この文字列の長さは、5文字です。
しかし、この値を表示する場合に必要なスペースを確保するなどの理由から、全角を2文字、半角文字(A-Z や 0-9 などの文字)を1文字として 7文字として評価したい場合があります。
そんな時は、以下のようにして取得します。
public int GetByteLength(string targetString) {
Encoding shiftJis = Encoding.GetEncoding("Shift_JIS");
return shiftJis.GetByteCount(targetString);
}
実は、今回話題にしたかったのは、この方法に関してではなく「何故、この処理で 7 を得ることができるのでしょうか」ということです。
以前、ある掲示板で「わからない」と言う方をお見かけしました。
最近そういう方が増えているのでしょうか。
今日は、そんな話題です。そして一応説明しておきます。
我らが Visual Studio では、基本的には Unicode という文字コードを使っています。
この文字コードは、全角も半角も同じバイト数になります。
例えば、「ANK」と「あんく」は同じ「6バイト」です。
一方、Shift_JIS では、ANK文字は 1バイト(0~255)の中に全て含むことができる程度の文字種類なので 1バイトで表わします。
そして、日本語の場合は、ANKで利用する文字コードで使用していないものを利用し、その次に1バイトを追加した 2バイトの組み合わせで表現します。
つまり、「ANK」は3バイトですが「あんく」は6バイトになります。
従って、Shift JISに変換して、バイト数を取得すれば、上記の例では 7 を得ることができるのです。