Принтер Zebra печатает символ UTF-8 как два символа ASCII

Печать на Zebra ZQ510 в режиме «line_print» на бумаге для чеков с непрерывной подачей.

! U1 setvar "ezpl.media_type" "continuous"  \r\n  
! U1 setvar "device.languages" "line_print" \r\n 
! U1 ENCODING UTF-8  \r\n
! U1 SETLP 5 0 28  \r\n
! U1 PAGE-WIDTH 580  \r\n
! U1 BEGIN-PAGE \r\n
Has the person to be vaccinated ever had      \r\n
Guillain-Barré syndrome?: \r\n
! U1 END-PAGE \r\n

Приведенные выше команды выводятся на подключение к принтеру с использованием этого кода Objective-C для кодирования двоичных данных как UTF-8:

-(void) printCommands: (NSString*) tPrintCommands {
    ...
    [aPrinterConn write:[tPrintCommands dataUsingEncoding:NSUTF8StringEncoding] error:&aError];
    ...
}

Но вместо «Барре» я получаю на распечатке «Барре». Кажется, что Unicode «é» обрабатывается принтером как 2 отдельных символа.

Я попытался заменить ! U1 ENCODING UTF-8 \r\n на ! U1 COUNTRY UTF-8 \r\n и расположил ! U1 ENCODING UTF-8 \r\n до и после BEGIN-PAGE. Один и тот же результат каждый раз.


person Chuck Krutsinger    schedule 10.03.2020    source источник
comment
Этот документ отвечает на ваш вопрос: zebra.com/us/en/support-downloads/knowledge-articles/ait/ Выдержка: Do note that this is using encoding ^CI0 and reading the UTF-8 encoded characters from the text file itself which doesn't require any Chinese font in printer! And in ^FD command, B0050 means 8-bit byte mode, ‘0050’ is the number of characters, this value must be greater than the actual value and must be exactly 4 decimal digits.   -  person Jay    schedule 11.03.2020
comment
@Джей. Спасибо, но этот ответ относится только к ZPL, который несовместим с режимом line_print, который мне нужно использовать для моего приложения.   -  person Chuck Krutsinger    schedule 11.03.2020
comment
Возможно ли, что каким-то образом вы сохранили файл, содержащий ваши примеры инструкций (которые вы вставили), был сохранен с латинской (или другой кодировкой, отличной от utf8)? Проблема с É на é распространена и коренится в том, как двоичные данные интерпретируются разными кодировками. См. weblogism.com/item/270/why-does-e. -become-a Если вы работаете в Windows, есть вероятность, что ваш терминал не использует UTF-8 по умолчанию. Вы можете изменить кодировку текущего сеанса, запустив chcp 65001   -  person Everett    schedule 20.03.2020
comment
@Everett Я добавил фрагменты кода, чтобы вы могли видеть, что данные закодированы в UTF-8.   -  person Chuck Krutsinger    schedule 20.03.2020
comment
Возможно, это проблема со шрифтом. Какой шрифт использует принтер?   -  person tukan    schedule 02.04.2020
comment
@tukan Использование встроенного шрифта #5. См. ! U1 SETLP 5 0 28. Желание оставаться простым и использовать встроенные шрифты, если это возможно. Я вижу в руководстве, что шрифт включает в себя символы 20-FF. Я вот думаю, значит нет UTF, только ASCII. Может быть, я смогу использовать символ ASCII с акцентом 130, если смогу понять, как его перекодировать.   -  person Chuck Krutsinger    schedule 02.04.2020
comment
Кто-нибудь знает, как преобразовать гласную UTF-8 с акцентами в ее эквивалент ASCII. Например, é следует преобразовать в ASCII 130.   -  person Chuck Krutsinger    schedule 02.04.2020
comment
@ChuckKrutsinger попробуйте закодировать объект C с помощью NSWindowsCP1252StringEncoding. 1252 обычно является кодовой страницей по умолчанию. Оставьте страну США (или Великобритания или что-то еще).   -  person yhyrcanus    schedule 02.04.2020
comment
Это не так просто. Во-первых, в обычном ASCII всего 127 позиций. Вам нужен расширенный символ ASCII. Вы можете попробовать изменить кодировку, но это будет означать, что вам придется использовать ASCII ENCODING вместо UTF8, но для этого все равно потребуется, чтобы шрифт поддерживал ее. Если шрифт не поддерживает расширенный ASCII, то ничего сделать нельзя. Если вы хотите использовать UTF8, вам нужен шрифт, который его поддерживает, больше ничего не поможет.   -  person tukan    schedule 02.04.2020
comment
@tukan В руководстве сказано, что шрифт поддерживает символы до FF (255). Я просто еще не нашел способ преобразовать строку UTF-8, которая у меня есть, в расширенный символ ASCII в Objective-C.   -  person Chuck Krutsinger    schedule 02.04.2020
comment
Я понял поддерживаемые символы, но у вас есть разные символы на 82 (130) для каждой кодовой страницы, убедитесь, что у вас есть правильная кодовая страница для вашего шрифта, чтобы вы получили правильный символ. Также вы, вероятно, захотите заменить U1 ENCODING UTF-8 на COUNTRY FRANCE и попытаться напечатать TEXT 4 0 0 35 #$@[\]^‘{|}~. Чтобы преобразовать UTF8 в ASCII, проверьте этот ответ SO - stackoverflow.com/questions/20031873/   -  person tukan    schedule 03.04.2020