Как печатать с кодовой страницей win-1250 на принтере zebra?

У меня есть этот код для печати на принтере Zebra (в частности, RW 420)

StringBuilder sb = new StringBuilder();            
sb.AppendLine("N");            
sb.AppendLine("q609");
sb.AppendLine("Q203,26");
//set printer character set to win-1250
sb.AppendLine("I8,B,001");
sb.AppendLine("A50,50,0,2,1,1,N,\"zażółć gęślą jaźń\"");
sb.AppendLine("P1");

printDialog1.PrinterSettings = new System.Drawing.Printing.PrinterSettings();
if (printDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
    byte[] bytes = Encoding.Unicode.GetBytes(sw.ToString());
    bytes = Encoding.Convert(Encoding.Unicode, Encoding.GetEncoding(1250), bytes);                
    int bCount = bytes.Length;
    IntPtr ptr = System.Runtime.InteropServices.Marshal.AllocCoTaskMem(bCount);
    System.Runtime.InteropServices.Marshal.Copy(bytes, 0, ptr, bytes.Length);
    Common.RawPrinterHelper.SendBytesToPrinter(printDialog1.PrinterSettings.PrinterName, ptr, bCount);
}

RawPrinterHelper — это курс от Microsoft, который я получил здесь.

Моя проблема в том, что только символы ASCII печатаются следующим образом:

za     g  l  ja  

Отсутствуют символы, отличные от ASCII.

Забавно, что когда я открываю Блокнот, помещаю туда тот же текст и печатаю его на принтере Zebra, все символы в порядке.


person Adrian Serafin    schedule 12.01.2011    source источник
comment
Похоже на проблему с кодировкой. Пробовали ли вы конвертировать в другую кодировку, например UTF-8 или ISO-8859-1?   -  person Matt Ball    schedule 12.01.2011
comment
Отсутствующие символы - это полированные символы из кодировок win-1250 или iso-8859-2, и я пробовал оба в методе Encoding.Convert...   -  person Adrian Serafin    schedule 12.01.2011
comment
Не могли бы вы решить проблему? Та же проблема здесь.   -  person Mori    schedule 22.09.2014


Ответы (4)


Разница в том, что Блокнот использует драйвер принтера, а вы его игнорируете. Принтеры Zebra имеют некоторую поддержку использования встроенных шрифтов. У него есть наборы символов для кодовой страницы 950 и то, что он называет «Latin 1» и «Latin 9». Основная проблема заключается в том, что ни один из них не содержит нужных вам глифов. Драйвер принтера решает эту проблему, отправляя на принтер графику, а не строки. Руководство по программированию здесь кстати.

Я полагаю, что у этих принтеров есть какая-то опция для установки дополнительных шрифтов, которые трудно продавать в остальном мире, если это не так. Обратитесь к дружественному поставщику принтера за поддержкой и вариантами.

person Hans Passant    schedule 12.01.2011
comment
согласно инструкции EPL, команда I8,B,048 должна установить кодовую страницу на win-1250, и это не имеет никакого эффекта. Я поговорю с поставщиком об этом, но я надеялся, что у какого-то другого разработчика, не говорящего по-английски, была такая же проблема, и он как-то с ней справился;) - person Adrian Serafin; 13.01.2011
comment
Кстати. Я иногда завидую англоговорящим разработчикам ;) моя жизнь была бы намного проще без всего этого кошмарного кодирования ;) - person Adrian Serafin; 13.01.2011

С помощью Wireshark я обнаружил, что кодировка от ZebraDesigner — это UTF-8, поэтому попробуйте преобразовать строку в byte[] как utf-8.

byte[] bytes = System.Text.Encoding.UTF8.GetBytes(sw.ToString());

чешские иероглифы типа ěščřžýáíé теперь в порядке

person zdenál    schedule 01.07.2015

Если вам нужно добавить пользовательские символы на свой принтер, взгляните на патч, который я сделал для SharpZebra. Должно быть тривиально изменить его, чтобы добавить поддержку этих отсутствующих букв.

person rkone    schedule 21.02.2011

Я добавил в свой класс вспомогательный метод, который будет преобразовывать строку (по умолчанию UTF-16) в кодировку UTF-8 byte[], а затем печатать ее.

public static bool SendUtf8StringToPrinter(string szPrinterName, string szString)
{   
    // by default System.String is UTF-16 / Unicode
    byte[] bytes = Encoding.Unicode.GetBytes(szString);

    // convert this to UTF-8. This is a lossy conversion and you might lose some chars
    bytes = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, bytes);
    int bCount = bytes.Length;

    // allocate some unmanaged memory
    IntPtr ptr = System.Runtime.InteropServices.Marshal.AllocCoTaskMem(bCount);

    // copy the byte[] into the memory pointer
    System.Runtime.InteropServices.Marshal.Copy(bytes, 0, ptr, bCount);

    // Send the converted byte[] to the printer.
    SendBytesToPrinter(szPrinterName, ptr, bCount);

    // free the unmanaged memory
    System.Runtime.InteropServices.Marshal.FreeCoTaskMem(ptr);

    // it worked! Happy cry.
    return true;
}
person Mark Cooper    schedule 21.03.2017