2011-01-12 21 views
4

ich diesen Code haben für das Drucken mit Zebra DruckerWie mit Win-1250 Codepage auf Zebra Drucker drucken?

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 ist die Klasse von Microsoft, die ich von here bekam (RW 420 um genau zu sein).

Mein Problem ist, dass nur ASCII-Zeichen wie diese gedruckt werden:

za  g l ja 

Nicht-ASCII-Zeichen fehlen.

Lustige Sache ist, dass, wenn ich den Editor öffne und den gleichen Text dort einlege und es auf dem Zebra-Drucker drucke, sind alle Zeichen in Ordnung.

+0

Es klingt wie ein Codierungsproblem. Haben Sie versucht, in eine andere Kodierung zu konvertieren, wie UTF-8 oder ISO-8859-1? –

+0

Fehlende Zeichen sind polnische Zeichen aus Win-1250 oder iso-8859-2 Zeichensätze und ich habe beide in Encoding versucht.Convert-Methode ... –

+0

Konnte Sie das Problem beheben? Das gleiche Problem ist hier. – Mori

Antwort

6

Der Unterschied ist, dass Notepad den Druckertreiber verwendet, Sie umgehen es. Zebra-Drucker unterstützen die Verwendung der integrierten Schriftarten. Es hat Zeichensätze für die Codepage 950 und etwas, das es "Latin 1" und "Latin 9" nennt. Das Hauptproblem ist, dass keiner von ihnen die Glyphen enthält, die Sie brauchen. Der Druckertreiber löst dieses Problem, indem er Grafiken an den Drucker sendet und keine Zeichenfolgen. Das Programmierhandbuch is here btw.

Ich könnte mir vorstellen, dass diese Drucker eine Art Option haben, zusätzliche Schriftarten zu installieren, schwer, den Verkauf in den Rest der Welt zu machen, wenn das nicht der Fall wäre. Wenden Sie sich an Ihren freundlichen Druckerhersteller, um Unterstützung und Optionen zu erhalten.

+0

gemäß epl manuellen Befehl I8, B, 048 sollte Codepage auf Win-1250 setzen und es hat überhaupt keine Wirkung. Ich werde mit dem Verkäufer darüber reden, aber ich hoffte irgendwie, dass ein anderer nicht englisch sprechender Entwickler das gleiche Problem hatte und sich damit auseinandersetzte;) –

+0

btw. Ich beneide manchmal Englisch sprechende Entwickler;) mein Leben wäre viel einfacher ohne alle Encodierung Albtraum;) –

1

Wenn Sie Ihrem Drucker benutzerdefinierte Zeichen hinzufügen müssen, werfen Sie einen Blick auf die patch, die ich für SharpZebra gemacht habe. Es sollte trivial sein, es zu modifizieren, um Unterstützung für die fehlenden Buchstaben hinzuzufügen.

2

ich mit Wireshark fand, dass charset von Zebradesigner ist UTF-8, so versuchen Zeichenfolge zu konvertieren byte [] als utf-8

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

tschechische Zeichen wie als ěščřžýáíé ist jetzt OK

0

Ich fügte meiner Klasse eine Hilfsmethode hinzu, die eine Zeichenfolge (die standardmäßig UTF-16 ist) in eine UTF-8 codierte byte[] konvertiert und diese dann ausgibt.

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; 
} 
Verwandte Themen