printing - world - zpl manual
Caracteres Unicode en impresora ZPL (8)
Acabo de descubrir que necesita escapar de los caracteres por encima de ASCII colocando primero ^FH
antes de cualquier campo ^FD
que pueda contener un carácter utf y debe prefijar el código hexadecimal utf-8 con un subrayado
_D0_94
se imprimirá como Д. Mi código ZPL final es el siguiente:
^XA
^LH100,150
^CWT,E:TT0003M_.FNT
^CFT,30,30
^CI28
^FT0,0^FH^FDTesting 1 2 3^FS
^FT0,50^FH^FD_D0_94_D0_BE _D1_81_D0_B2_D0_B8_D0_B4_D0_B0_D0_BD_D0_B8_D1_8F^FS
^FT0,100^B3^FDAAA001^FS
^XZ
Solo tendré que hacer una manera de generar las secuencias de escape, ¡lo cual debería ser mucho más fácil!
Tengo la tarea de rediseñar un sistema para imprimir etiquetas de envío, utilizando un Zebra GK420T en red. He podido enviarle trabajos de impresión ZPL perfectamente bien, pero parece que no consigo que imprima caracteres Unicode, como letras cirílicas. He descargado la fuente Lucida sans Unicode a la impresora usando los controladores de Seagull Scientific y estoy usando el siguiente código ZPL para probar:
^XA
^LH100,150
^CWT,E:TT0003M_.FNT
^CFT,30,30
^CI28
^FT0,0^FDTesting 1 2 3^FS
^FT0,50^FDДо свидания^FS
^FT0,100^B3^FDAAA001^FS
^XZ
Imprimirá el ''Prueba 1 2 3'' y el código de barras, pero deja un espacio en blanco en lugar de los caracteres cirílicos. ¿Estoy haciendo algo mal como no escapar caracteres o algo o es un problema con la impresora?
Gracias por adelantado
EDITAR: Intenté usar la fuente suicode Zebra y ahora imprime los caracteres rusos como signos de interrogación. He actualizado el código anterior para reflejarlo.
En las últimas versiones de firmware (desde v x.16.x) puede usar ^ CI33 para el texto codificado de la página de códigos Windows-1251 (y otras páginas de códigos) sin ^ FH. Ver manual
Estoy usando la impresora Zebra ZM400 y uso la fuente TT0003M_.
Esta fuente no imprime kazaj cirílico.
Si desea imprimir cryilic + kazakh cyrillic + latin alphabet, use ARI000.FNT (fuente arial)
Estoy usando el siguiente método de conversión de caracteres a código hexadecimal
espero que esto ayude
stringConverTextToHex(stringtext)
{
stringnewText="";
char[]charArray=text.ToCharArray();
foreach(charcincharArray)
{
switch(c)
{
case''й'':
newText+="_D0_B9";
break;
case''Й'':
newText+="_D0_99";
break;
case''ц'':
newText+="_D1_86";
break;
case''Ц'':
newText+="_D0_A6";
break;
case''у'':
newText+="_D1_83";
break;
case''У'':
newText+="_D0_A3";
break;
case''к'':
newText+="_D0_BA";
break;
case''К'':
newText+="_D0_9A";
break;
case''е'':
newText+="_D0_B5";
break;
case''Е'':
newText+="_D0_95";
break;
case''н'':
newText+="_D0_BD";
break;
case''Н'':
newText+="_D0_9D";
break;
case''г'':
newText+="_D0_B3";
break;
case''Г'':
newText+="_D0_93";
break;
case''ш'':
newText+="_D1_88";
break;
case''Ш'':
newText+="_D0_A8";
break;
case''щ'':
newText+="_D1_89";
break;
case''Щ'':
newText+="_D0_A9";
break;
case''з'':
newText+="_D0_B7";
break;
case''З'':
newText+="_D0_97";
break;
case''х'':
newText+="_D1_85";
break;
case''Х'':
newText+="_D0_A5";
break;
case''ъ'':
newText+="_D1_8A";
break;
case''Ъ'':
newText+="_D0_AA";
break;
case''ф'':
newText+="_D1_84";
break;
case''Ф'':
newText+="_D0_A4";
break;
case''ы'':
newText+="_D1_8B";
break;
case''Ы'':
newText+="_D0_AB";
break;
case''в'':
newText+="_D0_B2";
break;
case''В'':
newText+="_D0_92";
break;
case''а'':
newText+="_D0_B0";
break;
case''А'':
newText+="_D0_90";
break;
case''п'':
newText+="_D0_BF";
break;
case''П'':
newText+="_D0_9F";
break;
case''р'':
newText+="_D1_80";
break;
case''Р'':
newText+="_D0_A0";
break;
case''о'':
newText+="_D0_BE";
break;
case''О'':
newText+="_D0_9E";
break;
case''л'':
newText+="_D0_BB";
break;
case''Л'':
newText+="_D0_9B";
break;
case''д'':
newText+="_D0_B4";
break;
case''Д'':
newText+="_D0_94";
break;
case''ж'':
newText+="_D0_B6";
break;
case''Ж'':
newText+="_D0_96";
break;
case''э'':
newText+="_D1_8D";
break;
case''Э'':
newText+="_D0_AD";
break;
case''я'':
newText+="_D1_8F";
break;
case''Я'':
newText+="_D0_AF";
break;
case''ч'':
newText+="_D1_87";
break;
case''Ч'':
newText+="_D0_A7";
break;
case''с'':
newText+="_D1_81";
break;
case''С'':
newText+="_D0_A1";
break;
case''м'':
newText+="_D0_BC";
break;
case''М'':
newText+="_D0_9C";
break;
case''и'':
newText+="_D0_B8";
break;
case''И'':
newText+="_D0_98";
break;
case''т'':
newText+="_D1_82";
break;
case''Т'':
newText+="_D0_A2";
break;
case''ь'':
newText+="_D1_8C";
break;
case''Ь'':
newText+="_D0_AC";
break;
case''б'':
newText+="_D0_B1";
break;
case''Б'':
newText+="_D0_91";
break;
case''ю'':
newText+="_D1_8E";
break;
case''Ю'':
newText+="_D0_AE";
break;
case''ӑ'':
newText+="_D3_91";
break;
case''Ӑ'':
newText+="_D3_90";
break;
case''ӓ'':
newText+="_D3_93";
break;
case''Ӓ'':
newText+="_D3_92";
break;
case''ә'':
newText+="_D3_99";
break;
case''Ә'':
newText+="_D3_98";
break;
case''ӛ'':
newText+="_D3_9B";
break;
case''Ӛ'':
newText+="_D3_9A";
break;
case''ӕ'':
newText+="_D3_95";
break;
case''Ӕ'':
newText+="_D3_94";
break;
case''ґ'':
newText+="_D2_91";
break;
case''Ґ'':
newText+="_D2_90";
break;
case''ѓ'':
newText+="_D1_93";
break;
case''Ѓ'':
newText+="_D0_83";
break;
case''ғ'':
newText+="_D2_93";
break;
case''Ғ'':
newText+="_D2_92";
break;
case''ӷ'':
newText+="_D3_B7";
break;
case''Ӷ'':
newText+="_D3_B6";
break;
case''ҕ'':
newText+="_D2_95";
break;
case''Ҕ'':
newText+="_D2_94";
break;
case''ђ'':
newText+="_D1_92";
break;
case''Ђ'':
newText+="_D0_82";
break;
case''ѐ'':
newText+="_D1_90";
break;
case''Ѐ'':
newText+="_D0_80";
break;
case''ӗ'':
newText+="_D3_97";
break;
case''Ӗ'':
newText+="_D3_96";
break;
case''ҽ'':
newText+="_D2_BD";
break;
case''Ҽ'':
newText+="_D2_BC";
break;
case''ҿ'':
newText+="_D2_BF";
break;
case''Ҿ'':
newText+="_D2_BE";
break;
case''є'':
newText+="_D1_94";
break;
case''Є'':
newText+="_D0_84";
break;
case''ӂ'':
newText+="_D3_82";
break;
case''Ӂ'':
newText+="_D3_81";
break;
case''җ'':
newText+="_D2_97";
break;
case''Җ'':
newText+="_D2_96";
break;
case''ӝ'':
newText+="_D3_9D";
break;
case''Ӝ'':
newText+="_D3_9C";
break;
case''ҙ'':
newText+="_D2_99";
break;
case''Ҙ'':
newText+="_D2_98";
break;
case''ӟ'':
newText+="_D3_9F";
break;
case''Ӟ'':
newText+="_D3_9E";
break;
case''ӡ'':
newText+="_D3_A1";
break;
case''Ӡ'':
newText+="_D3_A0";
break;
case''ѕ'':
newText+="_D1_95";
break;
case''Ѕ'':
newText+="_D0_85";
break;
case''ѝ'':
newText+="_D1_9D";
break;
case''Ѝ'':
newText+="_D0_8D";
break;
case''ӥ'':
newText+="_D3_A5";
break;
case''Ӥ'':
newText+="_D3_A4";
break;
case''ӣ'':
newText+="_D3_A3";
break;
case''Ӣ'':
newText+="_D3_A2";
break;
case''і'':
newText+="_D1_96";
break;
case''І'':
newText+="_D0_86";
break;
case''ї'':
newText+="_D1_97";
break;
case''Ї'':
newText+="_D0_87";
break;
case''Ӏ'':
newText+="_D3_80";
break;
case''ҋ'':
newText+="_D2_8B";
break;
case''Ҋ'':
newText+="_D2_8A";
break;
case''ј'':
newText+="_D1_98";
break;
case''Ј'':
newText+="_D0_88";
break;
case''қ'':
newText+="_D2_9B";
break;
case''Қ'':
newText+="_D2_9A";
break;
case''ҟ'':
newText+="_D2_9F";
break;
case''Ҟ'':
newText+="_D2_9E";
break;
case''ҡ'':
newText+="_D2_A1";
break;
case''Ҡ'':
newText+="_D2_A0";
break;
case''ӄ'':
newText+="_D3_84";
break;
case''Ӄ'':
newText+="_D3_83";
break;
case''ҝ'':
newText+="_D2_9D";
break;
case''Ҝ'':
newText+="_D2_9C";
break;
case''ӆ'':
newText+="_D3_86";
break;
case''Ӆ'':
newText+="_D3_85";
break;
case''љ'':
newText+="_D1_99";
break;
case''Љ'':
newText+="_D0_89";
break;
case''ӎ'':
newText+="_D3_8E";
break;
case''Ӎ'':
newText+="_D3_8D";
break;
case''ӊ'':
newText+="_D3_8A";
break;
case''Ӊ'':
newText+="_D3_89";
break;
case''ң'':
newText+="_D2_A3";
break;
case''Ң'':
newText+="_D2_A2";
break;
case''ӈ'':
newText+="_D3_88";
break;
case''Ӈ'':
newText+="_D3_87";
break;
case''ҥ'':
newText+="_D2_A5";
break;
case''Ҥ'':
newText+="_D2_A4";
break;
case''њ'':
newText+="_D1_9A";
break;
case''Њ'':
newText+="_D0_8A";
break;
case''ӧ'':
newText+="_D3_A7";
break;
case''Ӧ'':
newText+="_D3_A6";
break;
case''ө'':
newText+="_D3_A9";
break;
case''Ө'':
newText+="_D3_A8";
break;
case''ӫ'':
newText+="_D3_AB";
break;
case''Ӫ'':
newText+="_D3_AA";
break;
case''ҩ'':
newText+="_D2_A9";
break;
case''Ҩ'':
newText+="_D2_A8";
break;
case''ҧ'':
newText+="_D2_A7";
break;
case''Ҧ'':
newText+="_D2_A6";
break;
case''ҏ'':
newText+="_D2_8F";
break;
case''Ҏ'':
newText+="_D2_8E";
break;
case''ҫ'':
newText+="_D2_AB";
break;
case''Ҫ'':
newText+="_D2_AA";
break;
case''ҭ'':
newText+="_D2_AD";
break;
case''Ҭ'':
newText+="_D2_AC";
break;
case''ћ'':
newText+="_D1_9B";
break;
case''Ћ'':
newText+="_D0_8B";
break;
case''ќ'':
newText+="_D1_9C";
break;
case''Ќ'':
newText+="_D0_8C";
break;
case''ў'':
newText+="_D1_9E";
break;
case''Ў'':
newText+="_D0_8E";
break;
case''ӳ'':
newText+="_D3_B3";
break;
case''Ӳ'':
newText+="_D3_B2";
break;
case''ӱ'':
newText+="_D3_B1";
break;
case''Ӱ'':
newText+="_D3_B0";
break;
case''ӯ'':
newText+="_D3_AF";
break;
case''Ӯ'':
newText+="_D3_AE";
break;
case''ү'':
newText+="_D2_AF";
break;
case''Ү'':
newText+="_D2_AE";
break;
case''ұ'':
newText+="_D2_B1";
break;
case''Ұ'':
newText+="_D2_B0";
break;
case''ҳ'':
newText+="_D2_B3";
break;
case''Ҳ'':
newText+="_D2_B2";
break;
case''һ'':
newText+="_D2_BB";
break;
case''Һ'':
newText+="_D2_BA";
break;
case''ҵ'':
newText+="_D2_B5";
break;
case''Ҵ'':
newText+="_D2_B4";
break;
case''ӵ'':
newText+="_D3_B5";
break;
case''Ӵ'':
newText+="_D3_B4";
break;
case''ҷ'':
newText+="_D2_B7";
break;
case''Ҷ'':
newText+="_D2_B6";
break;
case''ӌ'':
newText+="_D3_8C";
break;
case''Ӌ'':
newText+="_D3_8B";
break;
case''ҹ'':
newText+="_D2_B9";
break;
case''Ҹ'':
newText+="_D2_B8";
break;
case''џ'':
newText+="_D1_9F";
break;
case''Џ'':
newText+="_D0_8F";
break;
case''ӹ'':
newText+="_D3_B9";
break;
case''Ӹ'':
newText+="_D3_B8";
break;
case''ҍ'':
newText+="_D2_8D";
break;
case''Ҍ'':
newText+="_D2_8C";
break;
case''ӭ'':
newText+="_D3_AD";
break;
case''Ӭ'':
newText+="_D3_AC";
break;
case''A'':
newText+="_41";
break;
case''a'':
newText+="_61";
break;
case''B'':
newText+="_42";
break;
case''b'':
newText+="_62";
break;
case''C'':
newText+="_43";
break;
case''c'':
newText+="_63";
break;
case''D'':
newText+="_44";
break;
case''d'':
newText+="_64";
break;
case''E'':
newText+="_45";
break;
case''e'':
newText+="_65";
break;
case''F'':
newText+="_46";
break;
case''f'':
newText+="_66";
break;
case''G'':
newText+="_47";
break;
case''g'':
newText+="_67";
break;
case''H'':
newText+="_48";
break;
case''h'':
newText+="_68";
break;
case''I'':
newText+="_49";
break;
case''i'':
newText+="_69";
break;
case''J'':
newText+="_4A";
break;
case''j'':
newText+="_6A";
break;
case''K'':
newText+="_4B";
break;
case''k'':
newText+="_6B";
break;
case''L'':
newText+="_4C";
break;
case''l'':
newText+="_6C";
break;
case''M'':
newText+="_4D";
break;
case''m'':
newText+="_6D";
break;
case''N'':
newText+="_4E";
break;
case''n'':
newText+="_6E";
break;
case''O'':
newText+="_4F";
break;
case''o'':
newText+="_6F";
break;
case''P'':
newText+="_50";
break;
case''p'':
newText+="_70";
break;
case''R'':
newText+="_52";
break;
case''r'':
newText+="_72";
break;
case''S'':
newText+="_53";
break;
case''s'':
newText+="_73";
break;
case''T'':
newText+="_54";
break;
case''t'':
newText+="_74";
break;
case''U'':
newText+="_55";
break;
case''u'':
newText+="_75";
break;
case''V'':
newText+="_56";
break;
case''v'':
newText+="_76";
break;
case''Y'':
newText+="_59";
break;
case''y'':
newText+="_79";
break;
case''Z'':
newText+="_5A";
break;
case''z'':
newText+="_7A";
break;
case'''':
newText+="";
break;
default:
newText+=c;
break;
}
}
returnnewText;
}
este es el código de muestra
^ SP ^ XA ^ PON ^ FS ^ FPH ^ FO102,63,0 ^ A @ N, 60,60, E: ARIOOO_.FNT ^ FH ^ FD_42_75_72_61_6B _D0_A8_D3_99 ^ FS ^ XZ
Los caracteres rusos y muchos otros pueden imprimirse usando la fuente gratuita Zebra swiss Unicode . Ya está incluido en la mayoría de las impresoras como TT0003M_ y es compatible con Roman, Cyrillic, Eastern Europe, Turkish, Arabic, Hebrew.
Para imprimir lenguajes como el japonés o el chino, que tienen miles de caracteres, necesita una impresora con al menos 23 MB de memoria libre y un archivo de fuente TrueType que pueda cargar (lo llaman descarga).
Este archivo se puede comprar a Zebra (y dicen que necesitas 64 MB), pero también tuve mucho éxito con un archivo TTF muy antiguo que se encuentra en mi sistema Windows 7 en la carpeta de Fuentes: ARIALUNI.TTF 1.01 (23.275.812 Bytes) , Arial Unicode MS . Fue instalado por una instalación de MS Office y quizás no tenga licencia para este uso.
Lo más probable es que también puedas usar otros archivos TTF, pero solo probé este.
Mientras la impresión ZPL en esta impresora Zebra funcionaba sin ningún controlador original (solo texto genérico solamente), para la instalación de la fuente se necesitaba el controlador. Si alguien sabe cómo enviar el archivo TTF a la impresora sin controlador, comente.
Instalé las Utilidades de configuración de Zebra, que incluyen un descargador de fuentes. Haga clic en Nuevo, luego agregue la fuente (debe estar instalada en el sistema) e ignore el mensaje de que se incluyen 226 caracteres. También ignore que si configura una cadena de prueba con caracteres Unicode, no se mostrará correctamente. Se le preguntará si desea descargar ahora y le llevará mucho tiempo.
Puede verificar la instalación enumerando el contenido del directorio (página web de Administración o impresión). Allí la fuente aparece como ARI000.TTF en mi caso.
Para imprimir, debe enviar el texto ZPL como UTF-8. Puede copiar este ejemplo en el bloc de notas y seleccionar UTF-8 en el cuadro de diálogo Guardar:
^XA
^LH100,150
^CWT,E:ARI000.FNT
^CFT,30,30
^CI28
^FT0,0^FH^FDyour unicode characters here^FS
^XZ
Luego, para la prueba, puede usar un comando de copia simple para enviarlo a la impresora:
En el caso de USB, primero debe compartir esta impresora en la red.
Luego net use lpt1: //localhost/sharename
y copy file.txt lpt1
Probamos con muchos símbolos comunes japoneses y chinos y funciona muy bien con alta calidad, en una impresora ZT230 con 32 MB de flash.
Puede reemplazar el carácter que sea mayor que un byte a la cadena hexadecimal UTF-8 con un guión bajo como "ћ => _D1_9B". Código de muestra a continuación;
var zpl_code = "^XA" +
"^LH100,150" +
"^CWT,E:TT0003M_.FNT" +
"^CFT,30,30" +
"^CI28" +
"^FT0,0^FDTesting 1 2 3^FS" +
"^FT0,50^FDДо свидания^FS" +
"^FT0,100^B3^FDAAA001^FS" +
"^XZ";
var unicodeCharacterList = zpl_code.Distinct()
.Select(c => c.ToString())
.Select(c => new { key = c, UTF8Bytes = Encoding.UTF8.GetBytes(c) })
.Where(c => c.UTF8Bytes.Length > 1);
foreach (var character in unicodeCharacterList)
{
var characterHexCode = string.Join("", character.UTF8Bytes.Select(c => "_" + BitConverter.ToString(new byte[] { c }).ToLower()).ToArray());
zpl_code = zpl_code.Replace(character.key, characterHexCode);
}
Este código establece la variable zpl_code en la salida inferior
^XA
^LH100,150
^CWT,E:TT0003M_.FNT
^CFT,30,30
^CI28
^FT0,0^FDTesting 1 2 3^FS
^FT0,50^FD_d0_94_d0_be _d1_81_d0_b2_d0_b8_d0_b4_d0_b0_d0_bd_d0_b8_d1_8f^FS
^FT0,100^B3^FDAAA001^FS
^XZ
Si desea imprimir letras cirílicas rusas con :TT0003M_.FNT
, debe guardar los comandos en el archivo con codificación UTF-8.
^XA
^LH100,150
^CWT,E:TT0003M_.FNT
^CFT,30,30
^CI28
^FT0,0^FH^FDTesting 1 2 3^FS
^FT0,30^FH^FDДо свидания^FS
^FT0,100^B3^FDAAA001^FS
^XZ
Luego, utilizando la línea de comandos puede enviarlo al puerto de la impresora. Un ejemplo: copie C: / Users / xxx / Desktop / test_ru.txt com1
Espero que le ayudará...
Su "До свидания" probablemente se encontraba en cp1251. Codifíquelo en UTF-8 real e inténtelo de nuevo. Los espacios en blanco son un buen indicador de que tiene un problema de codificación.
Verificado con firmware v56.17.112 y ^ A @ N ,,, E: TT0003M_.FNT
Tuve el mismo problema, debería agregar un ^FH
(Indicador hexadecimal de campo) antes de cualquier comando ^FD
(Datos de campo) que contenga caracteres especiales, en mi caso necesito caracteres en español, así que tuve que usar ^CI28
(Cambiar fuente internacional / Codificación)
Ejemplo: para imprimir Alvaro Jesús Pérez Peñaranda
, necesitamos convertir esos caracteres especiales a código hexadecimal UTF 8 y agregar una _ antes de cada código. Este es el resultado: Alvaro Jes_c3_bas P_c3_a9rez Pe_c3_b1aranda
^XA
^CI28
^FO60,75
^ASN,36,20^FH^FDAlvaro Jes_c3_bas P_c3_a9rez Pe_c3_b1aranda^FS
^XZ