.NET環境における文字コード変換処理は、特に多言語対応システムで重要な役割を果たします。以下に実践的な実装例を、エンコーディング方式ごとに整理して説明します。
GBK形式のバイナリ変換
16進数文字列をGBK文字列に変換する際は、バイト配列の正確な処理が不可欠です。
var hexInput = "D6B1 B2E5 CADB 3230 3139 3132 3237 3030 3032 310D";
var tokens = hexInput.Split(' ', StringSplitOptions.RemoveEmptyEntries);
var bytes = Array.ConvertAll(tokens, t => Convert.ToByte(t, 16));
var result = Encoding.GetEncoding(936).GetString(bytes); // 出力: 直插式2019122700021\r
逆に文字列をGBK形式の16進数に変換する場合は、バイトシーケンスを適切にフォーマットします。
var kanjiText = "漢字テスト123";
var gbkBytes = Encoding.GetEncoding(936).GetBytes(kanjiText);
var hexOutput = string.Join(" ", gbkBytes.Select(b => b.ToString("X2")));
var decimalOutput = string.Join(" ", gbkBytes);
// hexOutput例: BABA D6D6 CCE5 B2E2 CAD4 3132 33
// decimalOutput例: 186 186 214 214 204 229 178 226 202 212 49 50 51
UTF-16LE(Unicode)形式の処理
.NETでいうUnicodeは実際にはUTF-16LEを指します。バイト順序マークの扱いに注意が必要です。
var hexSequence = "496C 575B E654 3100 3100 3000";
var utf16Bytes = new byte[hexSequence.Length / 2];
for (int i = 0; i < hexSequence.Length; i += 2)
{
utf16Bytes[i/2] = Convert.ToByte(hexSequence.Substring(i, 2), 16);
}
var utf16Text = Encoding.Unicode.GetString(utf16Bytes); // 出力: 漢字テスト123
文字列をUTF-16LE形式の16進数に変換する際は、リトルエンディアン形式を考慮します。
var utf16Source = "UTF-16テスト";
var sourceBytes = Encoding.Unicode.GetBytes(utf16Source);
var formattedHex = string.Join(" ",
Enumerable.Range(0, sourceBytes.Length / 2)
.Select(i => $"{sourceBytes[i*2]:X2}{sourceBytes[i*2+1]:X2}"));
// 出力例: 496C 575B E654 3100 3200 3300
UTF-8形式のバイナリ変換
多言語対応で最も一般的なUTF-8の処理方法です。漢字は3バイトシーケンスで表現されます。
var utf8Hex = "E6BCA2 E5AD97 E38386 E382B9 E38388 31 32 33";
var utf8Bytes = new List<byte>();
foreach (var segment in utf8Hex.Split(' '))
{
for (int i = 0; i < segment.Length; i += 2)
{
utf8Bytes.Add(Convert.ToByte(segment.Substring(i, 2), 16));
}
}
var utf8Text = Encoding.UTF8.GetString(utf8Bytes.ToArray()); // 出力: 漢字テスト123
文字列をUTF-8形式の16進数に変換する実装例:
var targetText = "UTF-8日本語";
var utf8Data = Encoding.UTF8.GetBytes(targetText);
var hexPairs = utf8Data.Select(b => b.ToString("X2")).ToArray();
var hexString = string.Join(" ",
hexPairs.Chunk(3).Select(c => string.Join(string.Empty, c)));
// 出力例: E7 A781 E381 AF E38386 E382B9 E38388 31 32 33