質問

ZPL IIを使用してZebra S4Mに拡張コード850文字を印刷しようとしています。拡張文字の1つ、つまりASCII値> 127が使用されるたびに、実際の値ではなく、さまざまな色合いの灰色の箱を取得します。

±と°を印刷しようとしています(alt+0177およびalt+0176)。私が使用しようとしているrawprinterhelper(MSからダウンロードされ、もう1つはcodeprojectから)を使用しようとしているのではないかと思いますが、文字コードがどこで間違っているのかわかりません。

奇妙なことに、メモ帳から直接印刷すると、正しい文字がレンダリングされ、それが生のプリンターヘルパークラスの問題であると信じさせます。

私はRaw Printer Helperクラスを使用することに関係していないので、それを行うより良い方法があれば、私はそれらを見てうれしいです。

サンプルzplii逃げられたcharsなし

^XA
^FO30,200^AD^FH,18,10^FD35 ± 2 ° ^FS
^FS
^XZ

逃げられたチャーで(上品と小文字の両方を試しました)

^XA
^FO30,200^AD^FH,18,10^FD35 _b0 2 _b1 ^FS
^FS
^XZ

生のプリンターヘルパー

[StructLayout(LayoutKind.Sequential)]
public struct DOCINFO
{
    [MarshalAs(UnmanagedType.LPWStr)]
    public string printerDocumentName;
    [MarshalAs(UnmanagedType.LPWStr)]
    public string pOutputFile;
    [MarshalAs(UnmanagedType.LPWStr)]
    public string printerDocumentDataType;
}

public class RawPrinter
{
    [
        DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = false,
            CallingConvention = CallingConvention.StdCall)]
    public static extern long OpenPrinter(string pPrinterName, ref IntPtr phPrinter, int pDefault);

    [
        DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = false,
            CallingConvention = CallingConvention.StdCall)]
    public static extern long StartDocPrinter(IntPtr hPrinter, int Level, ref DOCINFO pDocInfo);

    [
        DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true,
            CallingConvention = CallingConvention.StdCall)]
    public static extern long StartPagePrinter(IntPtr hPrinter);

    [
        DllImport("winspool.drv", CharSet = CharSet.Ansi, ExactSpelling = true,
            CallingConvention = CallingConvention.StdCall)]
    public static extern long WritePrinter(IntPtr hPrinter, string data, int buf, ref int pcWritten);

    [
        DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true,
            CallingConvention = CallingConvention.StdCall)]
    public static extern long EndPagePrinter(IntPtr hPrinter);

    [
        DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true,
            CallingConvention = CallingConvention.StdCall)]
    public static extern long EndDocPrinter(IntPtr hPrinter);

    [
        DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true,
            CallingConvention = CallingConvention.StdCall)]
    public static extern long ClosePrinter(IntPtr hPrinter);

    public static void SendToPrinter(string printerJobName, string rawStringToSendToThePrinter,
                                     string printerNameAsDescribedByPrintManager)
    {
        IntPtr handleForTheOpenPrinter = new IntPtr();
        DOCINFO documentInformation = new DOCINFO();
        int printerBytesWritten = 0;
        documentInformation.printerDocumentName = printerJobName;
        documentInformation.printerDocumentDataType = "RAW";
        OpenPrinter(printerNameAsDescribedByPrintManager, ref handleForTheOpenPrinter, 0);
        StartDocPrinter(handleForTheOpenPrinter, 1, ref documentInformation);
        StartPagePrinter(handleForTheOpenPrinter);
        WritePrinter(handleForTheOpenPrinter, rawStringToSendToThePrinter, rawStringToSendToThePrinter.Length,
                     ref printerBytesWritten);
        EndPagePrinter(handleForTheOpenPrinter);
        EndDocPrinter(handleForTheOpenPrinter);
        ClosePrinter(handleForTheOpenPrinter);
    }
}

受け入れられた答えからの実際の修正 キャラクターの国際化(コード)を設定します ^CI27 )1252ページをコードします。

^XA
^FO30,200^AD^CI27^FH,18,10^FD35 _b0 2 _b1 ^FS
^FS
^XZ
役に立ちましたか?

解決

はい、影付きのボックスには、コードページ1252にこれらのバイトコードがあります。これは間違いなくプリンターのデフォルトコードページであり、1252は西ヨーロッパとアメリカのWindowsコードページです。

コードページを850に切り替えるにはコマンドを送信する必要があります。 マニュアル, 、それには、文字セット13を選択するには ^ciが必要です。

コードページを1252に保持し、代わりに文字コードを変更するのが賢明です。グリフテーブルはマニュアルの裏にあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top