0

簡体字中国語を含む文字列を 2 バイト エンコーディング (GB2312) に変換しようとすると問題が発生します。これは、漢字をゼブラ プリンタに印刷するためのものです。

私が見ている仕様は、38_54_47_78_49_2b_34_74.

私のC#コードでは、以下のコードをテストとして使用してこれを変換しようとしています。私の結果は、先頭の 16 進値で 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 ビット エンコーディングであるということです。

興味深いことに、エンコーディングの 7 ビット バージョンGB2312は存在し、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 文字バイト (1 バイト エンコーディング) と GB 漢字バイト (2 バイト エンコーディング) の混合をサポートしているためです。エスケープ シーケンスは、ASCII として解釈されるべきではない領域をマークします。

エンコーディングの使用を選択した場合、hz-gb-2312不要なエスケープ シーケンスを自分で取り除く必要があります。しかし、おそらくあなたはそれらを必要としています。プリンターが何を期待しているかを正確に把握する必要があります。

あるいは、本当にこれらのエスケープ シーケンスを使用したくない場合、および ASCII 文字を処理する必要がなく、中国語の 2 バイト文字のみを処理する必要があると確信している場合は、そのまま使用することを選択できます。バニラGB2312エンコーディングを使用し、すべてのバイトの最上位ビットを自分でドロップして、結果を基本的に 7 ビットエンコーディングに変換します。

コードは次のようになります。0x7F8 番目のビットを削除するために、各バイト値をマスクしていることに注意してください。

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 に答える