データ操作

[C#] 文字列をバイト数で切り出す(全角文字の途中で切れる場合の対応版)

2021年10月14日

全角文字の途中で切れる場合にも対応した文字列をバイト数で切り出すサンプルです。

文字列をバイト数で切り出す時、指定したバイト数が全角文字の途中になる場合はうまく切り出すことができません。

そこで、指定したバイト数が全角文字の途中となる場合でも指定したバイト数を超える文字列にはならないような関数を作成しました。

サンプル

例)文字列をバイト数で切り出す関数


public static string GetByteSubstr(string str, int byteCount)
{
  //Shift-JISのエンコーディングを取得する
  Encoding enc = Encoding.GetEncoding("Shift_JIS");

  //指定したバイト数が文字バイト数以上であれば文字列をそのまま返す
  if (enc.GetByteCount(str) <= byteCount)
  {
    return str;
  }

  //文字列のバイト配列を取得する
  byte[] b = enc.GetBytes(str);

  //①指定されたバイト数で文字を切り出す
  string result = enc.GetString(b, 0, byteCount);

  //②指定されたバイト数+1バイトで文字を切り出す
  string result2 = enc.GetString(b, 0, byteCount + 1);

  //①と②の文字数を比較する
  if(result.Length == result2.Length)
  {
    //同じなら①から最後の1文字を削除した文字列を返す
    return result.Remove(result.Length - 1);
  }
  else
    //異なれば①をそのまま返す
  {
    return result;
  }
}

以下、上記メソッドの使用例です。


//全角文字の途中とならないパターン
string a1 = GetByteSubstr("あいうえお", 8);
→ "あいうえ"

//全角文字の途中となるパターン
string a2 = GetByteSubstr("あいうえお", 9);
→ "あいうえ"

//全角文字の途中とならないパターン
string a3 = GetByteSubstr("あaいうえお", 9);
→ "あaいうえ"

//全角文字の途中となるパターン
string a4 = GetByteSubstr("あaいうえお", 10);
→ "あaいうえ"

備考

  • 文字列をバイト数で切り出す場合、EncodingのGetStringメソッドを使えば切り出せますが、指定したバイト数が全角文字の途中となった場合、指定したバイト数以上の文字列が取れてしまいます。
  • これを防ぎたい場合は、上記関数をご使用ください。

関連記事

-データ操作
-