对我来说唯一有意义的38_54_47_78_49_2b_34_74
是某种形式的 7 位编码。
GB2312
有趣的是,确实存在7 位版本的编码,称为HZ
字符编码。
这是HZ 上的维基百科条目。有趣的部分:
... 编码是为了方便通过电子邮件使用汉字而HZ
发明的,当时只允许使用7 位字符。
该HZ
代码仅使用可打印的7 位字符来表示汉字。
而且,根据这个关于 EncodingInfo.GetEncoding 的 Microsoft 参考页面,.NET 支持这种字符编码:
52936 hz-gb-2312 简体中文 (HZ)
如果我尝试您的代码,并替换要使用的字符编码HZ
,我会得到:
static void Main(string[] args)
{
const string SimplifiedChineseChars = "冈区色呆";
byte[] bytes = Encoding.GetEncoding("hz-gb-2312").GetBytes(SimplifiedChineseChars);
string hex = BitConverter.ToString(bytes).Replace("-", "_");
Console.WriteLine(hex);
}
输出:
7E_7B_ 38_54_47_78_49_2B_34_74 _7E_7D
所以,你基本上得到了你正在寻找的东西,除了它添加了转义序列~{
和~}
汉字字节之前和之后。这些转义序列是必要的,因为这种编码支持将 ASCII 字符字节(单字节编码)与 GB 汉字字节(双字节编码)混合。转义序列标记不应被解释为 ASCII 的区域。
如果您选择使用hz-gb-2312
编码,如果您认为不需要它们,则必须自己去除任何不需要的转义序列。但是,也许你确实需要它们。您必须确切地弄清楚您的打印机所期望的。
或者,如果您真的不想使用这些转义序列,并且您不担心必须处理 ASCII 字符,并且确信您只需要处理中文双字节字符,那么您可以选择坚持使用vanillaGB2312
编码,然后自己删除每个字节的最高有效位,以将结果本质上转换为 7 位编码。
这是代码的样子。0x7F
请注意,我用删除第 8 位来屏蔽每个字节值。
static void Main(string[] args)
{
const string SimplifiedChineseChars = "冈区色呆";
byte[] bytes = Encoding.GetEncoding("gb2312") // vanilla gb2312 encoding
.GetBytes(SimplifiedChineseChars)
.Select(b => (byte)(b & 0x7F)) // retain 7 bits only
.ToArray();
string hex = BitConverter.ToString(bytes).Replace("-", "_");
Console.WriteLine(hex);
}
输出:
38_54_47_78_49_2B_34_74