C#は文字列の文字コードはUnicodeのため、例えばSubstringメソッドで文字列の一部を抜き出す場合は、文字単位でしか指定することができない。これをバイト単位で抜き出すには、以下のように文字コードにシフトJISを指定して、EncodingクラスのGetBytesメソッドとGetStringメソッドを利用する。
static string SubstringByte(string s, int i, int n) {
System.Text.Encoding sjis =
System.Text.Encoding.GetEncoding("shift_jis");
byte[] b = sjis.GetBytes(s);
return sjis.GetString(b, i, n);
}
第2引数にはSubstringメソッドと同様に、開始のインデックス(1文字目が0)を指定する。第3引数には抜き出すバイト数を指定する。
Console.WriteLine(SubstringByte("ABCDE", 0, 2));
Console.WriteLine(SubstringByte("ABCDE", 1, 3));
Console.WriteLine(SubstringByte("あいうえ", 0, 4));
Console.WriteLine(SubstringByte("あいうえ", 2, 2));
Console.WriteLine(SubstringByte("あいABC", 0, 5));
Console.WriteLine(SubstringByte("あいABC", 2, 4));
Console.WriteLine(SubstringByte("あいABC", 1, 4));
出力結果
AB
BCD
あい
い
あいA
いAB
(0xA0)いA ※先頭文字は画面表示不可の0xA0が表示
上記の自作メソッドは、マルチバイトの文字の処理は行っていない。そのため、最後の例のようにマルチバイトの文字列を分断するような指定をした場合は、バイト単位でそのとおりに処理されるので当然出力は乱れるので注意。