Расширенные символы ZPL II - PullRequest
       102

Расширенные символы ZPL II

3 голосов
/ 21 апреля 2010

Я пытаюсь распечатать расширенную кодовую страницу 850 символов с помощью ZPL II на Zebra S4M. Всякий раз, когда один из расширенных персонажей И.Е. Используется значение ASCII> 127. Я получаю коробку с различными оттенками серого вместо фактического значения.

Я пытаюсь напечатать ± и ° (ALT + 0177 и ALT + 0176). Я подозреваю, что это RawPrinterHelper, который я пытаюсь использовать (как загруженный из MS, а другой из CodeProject), однако я не могу видеть, где коды символов идут не так.

Как ни странно, прямая печать из Блокнота отображает правильные символы, что заставляет меня думать, что это проблема с классом вспомогательного принтера.

Я не привязан к использованию класса Raw Printer Helper, поэтому, если есть лучший способ сделать это, я более чем рад их видеть.

SAMPLE ZPLII Без сбежавших символов

^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

1 Ответ

5 голосов
/ 21 апреля 2010

Да, в заштрихованных полях есть эти байтовые коды в кодовой странице 1252. Что, без сомнения, является кодовой страницей по умолчанию для принтера, 1252 - это кодовая страница Windows для Западной Европы и Америки.

ВыПридется отправить команду для переключения кодовой страницы на 850. Судя по инструкции , для которой требуется ^ CI для выбора набора символов 13.

Сохранение кодовой страницы на 1252 и изменениевместо этого, ваши коды символов будут мудрыми.Таблицы глифов находятся в конце руководства.

...