10進数の文字コード値から文字に変換する
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;
}
}
さいごに
とてもニッチなのか、ぐぐってもろくにでなくて大変でした。
エンディアンとか知らなかったですし…。
とりあえず動くんですけど、なんかもっといい方法とかかっこいい書き方ないですか…。
Author And Source
この問題について(10進数の文字コード値から文字に変換する), 我々は、より多くの情報をここで見つけました https://qiita.com/kxn4t/items/5eace085a47e2ce7c1dd著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .