LoginSignup
1
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-02-28

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;
            }
        }

さいごに

とてもニッチなのか、ぐぐってもろくにでなくて大変でした。
エンディアンとか知らなかったですし…。
とりあえず動くんですけど、なんかもっといい方法とかかっこいい書き方ないですか…。

1
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3