C# ZPL II扩展字符
我正在尝试使用ZPL II将扩展代码页850个字符打印到Zebra S4M。每当使用一个扩展字符,即ASCII值>127时,我会得到一个不同灰度的框,而不是实际值 我正在尝试打印±和°(ALT+0177和ALT+0176)。我怀疑这是我试图使用的RawPrinterHelper(从MS下载,另一个从CodeProject下载),但是我看不出字符代码哪里出错了 奇怪的是,直接从记事本打印会呈现正确的字符,这让我相信这是原始打印机助手类的问题 我不喜欢使用Raw Printer Helper类,所以如果有更好的方法,我非常乐意看到它们 样本ZPLII 没有逃脱的魔咒C# ZPL II扩展字符,c#,ansi,zebra-printers,zpl,zpl-ii,C#,Ansi,Zebra Printers,Zpl,Zpl Ii,我正在尝试使用ZPL II将扩展代码页850个字符打印到Zebra S4M。每当使用一个扩展字符,即ASCII值>127时,我会得到一个不同灰度的框,而不是实际值 我正在尝试打印±和°(ALT+0177和ALT+0176)。我怀疑这是我试图使用的RawPrinterHelper(从MS下载,另一个从CodeProject下载),但是我看不出字符代码哪里出错了 奇怪的是,直接从记事本打印会呈现正确的字符,这让我相信这是原始打印机助手类的问题 我不喜欢使用Raw Printer Helper类,所以
^XA
^FO30,200^AD^FH,18,10^FD35 ± 2 ° ^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。从中判断,这需要^CI选择字符集13
将代码页保持在1252,改为更改字符代码是明智的。glyph表在手册的后面。谢谢Hans-我会在早上试一试,看看这是否解决了问题
^XA
^FO30,200^AD^CI27^FH,18,10^FD35 _b0 2 _b1 ^FS
^FS
^XZ