2

ハードコードされた文字列をパラメータとして渡すと\x1B|200uF、コマンドがそれを正しく受け入れるという問題があります。

しかし、XML要素から新しい文字列変数に同じ値を取得すると、次の値が得られます。\\x1B|200uF

ご覧のとおり、追加のエスケープシーケンスがあります。

要約すると、問題は次のとおりです。

 using (XmlReader xmlReader = XmlReader.Create(@"PosPrinter.xml"))
                {     
                    while (xmlReader.Read())
                    {
                        if (xmlReader.NodeType == XmlNodeType.Element)
                        {
                            switch (xmlReader.Name)
                            {
                                case "PosPrinter":
                                    _printer.LogicalName = xmlReader.GetAttribute("LogicalName");
                                    break;

                                case "FeedReceiptCommand":
                                    _printer.FeedReceiptCommand = xmlReader.GetAttribute("value");
                                    break;

'FeedReceiptCommand'文字列に値を取得します。上記の値はxmlに保存されますが、最初の追加のエスケープシーケンスと\x1B|200uF同様に文字列に取得されます。\\x1B|200uF

次に、文字列変数FeedReceiptCommandを使用してコマンドを呼び出します。

 _posPrinter.PrintNormal(PrinterStation.Receipt, PrinterSettings.FeedReceiptCommand );

ただし、余分なエスケープシーケンスがあるため、コマンドは実行されません。

しかし、ハードコードされた値で同じコマンドを呼び出すと、次のようになります。

 _posPrinter.PrintNormal(PrinterStation.Receipt, "\x1B|200uF");

...その後、コマンドは正常に実行されます。

\x1B|200uFは、Microsoft.PointOfServiceを使用してEpson TM-T88Vプリンターに送信するESCコマンドです。一方、「\ x」は16進数用であり、1Bは16進数値です。

'Trim'、'Substring'を使用し、foreachループを実行して文字列内の各文字をループし、新しい文字を作成することで、余分なエスケープシーケンスを削除しようとしました。stringbuilderも試してみました。

しかし、私はここのどこかでポイントを逃しています。

したがって、の代わりに変数を渡す方法について助けていただければ幸いです。\x1B|200uF

4

2 に答える 2

3

問題は(@OlafDietscheが指摘したように)確かにXMLファイルにあります。C#文字列では、\ x1Bは「コード1B(16進数)または27(12月)の文字」を意味します。XMLでは4文字だけです。

したがって、XMLドキュメント内の特殊文字を別の方法でエンコードする必要があります。理論的には、\ x1Bを単に置き換えます。これは「文字番号1B(16進数)」のXMLの言い方です。ただし、この特定の場合の問題は、XMLでは許可されていないことです。XMLドキュメントの有効な文字は次のように定義されています。http ://www.w3.org/TR/xml/#charsets#x1B がこの範囲の一部ではないことに注意してください。

別の文字を使用してXMLでエスケープを表し、C#コード内で置き換えることができます。a)有効なXML文字であり、b)実際のデータとして使用されることのない代理文字を使用してください。

たとえば、エスケープ文字としてxFEEDを選択します(認識しやすいため)。したがって、ドキュメントは次のようになります。

<FeedReceiptCommand value="&#xFEED;|200uF"/>

C#コードで、それに応じて置き換えます。

string actualValue = reader.GetAttribute("value").Replace('\xFEED', '\x1B')
于 2013-02-13T23:23:29.077 に答える
1

ハードコードされた文字列には、文字列の16進数1BESC文字列が含まれます|200uF。私はあなたのXMLを見たことがありませんが、XMLでは、\x1B文字通り、4文字\、、、およびの文字列を持っていると思います。x1B

これが、ハードコードされたXMLとXMLの2つの違いです。

ESCAFAIK、 XML1.0ドキュメントに文字通り制御文字を含める方法はありません。XMLパーサーによって適切に配信されない場合は、としてエンコードし&#x001B;て自分で解析しようとする可能性があります。

于 2013-02-13T23:09:45.897 に答える