Edited at

10進数の文字コード値から文字に変換する

More than 1 year has passed since last update.

10進数の文字コード値をbyteにして文字に戻すのに苦労したので、とりあえず書きます。

UTF8とかでも同じようにできると思います。

(ビッグエンディアンの時のテストができてないのでそこはかなり怪しいです)

(ビッグエンディアンのときはどう返ってくるかイマイチ理解が及ばない…)


前提

文字列「にゃーん」はShiftJISだと、こうなります。

文字
Shift_JIS(16進)


82 C9


82 E1


81 5B


82 F1

こいつをさらに10進数にします(符号ありで)

文字
Shift_JIS(16進)
10進数


82C9
-32055


82E1
-32031


815B
-32421


82F1
-32015

この10進数をそれぞれ文字に戻したいです。


実装

↓な感じで実装してみました。


実装

        /// <summary>

/// 文字コード値(10進数)を変換する(1文字)
/// (例)引数「-32055」を受け取り、変換後文字「に」を返す。
/// </summary>
/// <param name="sJisCharCode">変換するコード値</param>
/// <returns>変換後文字(1文字)</returns>
public static string DecodeSJisWord(int sJisCharCode)
{
byte[] byteArray = GetSJisBytes(sJisCharCode);

return Encoding.GetEncoding("shift_jis").GetString(byteArray);
}

/// <summary>
/// ShiftJISの文字コード値を10進数(符号あり)からbyte配列に変換
/// </summary>
/// <param name="sJisCharCode">文字コード値(10進数)</param>
/// <returns>変換後文字コード値(1or2byte 10進数)</returns>
private static byte[] GetSJisBytes(int sJisCharCode)
{
// コードからbyteを取得(4byte)
byte[] byteArray = BitConverter.GetBytes(sJisCharCode);

// ShiftJISは2byteのため、4→2byteに変換する
byte[] rtn = new byte[2];

// 環境によってバイトの格納順を変更
if (BitConverter.IsLittleEndian)
{
rtn[0] = byteArray[1];
rtn[1] = byteArray[0];
}
else
{
rtn[0] = byteArray[2];
rtn[1] = byteArray[3];
}

// 1バイト文字の場合は2→1バイトに変換する
rtn = Convert2To1ByteIfNeeded(rtn);

return rtn;
}

/// <summary>
/// 1バイト文字だったら1バイトにする、2バイト文字の場合はなにもしない
/// (必要に応じて2バイトを1バイトに変換する)
/// </summary>
/// <param name="checkArray">変換対象(2byte)</param>
/// <returns>変換後byte配列</returns>
private static byte[] Convert2To1ByteIfNeeded(byte[] checkArray)
{
// 1バイト文字のとき
if (checkArray[0] == 0)
{
return new byte[] { checkArray[1] };
}
// 2バイト文字
else
{
return checkArray;
}
}



さいごに

とてもニッチなのか、ぐぐってもろくにでなくて大変でした。

エンディアンとか知らなかったですし…。

とりあえず動くんですけど、なんかもっといい方法とかかっこいい書き方ないですか…。