0

我在尝试将包含简体中文的字符串转换为双字节编码 (GB2312) 时遇到问题。这是为了将汉字打印到斑马打印机上。

我正在查看的规范显示了一个带有“冈区色呆”文本的示例,它们显示为转换为 38_54_47_78_49_2b_34_74 的十六进制值。

在我的 C# 代码中,我尝试使用下面的代码将其转换为测试。我的结果在前导十六进制值中似乎偏离了 7。我在这里想念什么?

       private const string SimplifiedChineseChars = "冈区色呆";

        [TestMethod]
        public void GetBackCorrectHexValues()
        {
            byte[] bytes = Encoding.GetEncoding(20936).GetBytes(SimplifiedChineseChars);
            string hex = BitConverter.ToString(bytes).Replace("-", "_");                
            //I get the following: B8_D4_C7_F8_C9_AB_B4_F4
            //I am expecting:      38_54_47_78_49_2b_34_74
        }
4

1 回答 1

3

对我来说唯一有意义的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

于 2015-12-18T02:31:59.677 回答