Почему символ евро печатается как aséÔ? - PullRequest
0 голосов
/ 01 июля 2018

У меня Epson TM-T20, настроенный с кодовой страницей 858. Я сделал тестовую распечатку кодовой страницы, и символы в порядке. Класс Java имеет кодировку UTF-8. Я пытаюсь напечатать текст с такими символами, как é , ç и , присутствующими в уже названной кодовой странице.

Принтер совместим со следующими типами документов:

Arrays.stream(service.getSupportedDocFlavors()).forEach(f->System.out.println(f.getMediaType()+":"+f.getMimeType()+":"+f.getRepresentationClassName()));

image:image/gif:[B
image:image/gif:java.io.InputStream
image:image/gif:java.net.URL
image:image/jpeg:[B
image:image/jpeg:java.io.InputStream
image:image/jpeg:java.net.URL
image:image/png:[B
image:image/png:java.io.InputStream
image:image/png:java.net.URL
application:application/x-java-jvm-local-objectref:java.awt.print.Pageable
application:application/x-java-jvm-local-objectref:java.awt.print.Printable
application:application/octet-stream:[B
application:application/octet-stream:java.net.URL
application:application/octet-stream:java.io.InputStream

Пока я пытался:

Попытка 1: с InputStream

public static void print(){
  InputStream bytes = new ByteArrayInputStream(("Estó ès una pruebà \r\n Hola qu€ tal").getBytes());    
  PrintService service = PrintServiceLookup.lookupDefaultPrintService();
  DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
  DocPrintJob pj = service.createPrintJob();
  Doc doc = new SimpleDoc(bytes, flavor, null);
  pj.print(doc, null);
}

Выход:

Estó ès una pruebà
Hola quÔé¼ tal

Попытка 2: с байтом [], тот же вывод

 public static void print(){
    byte[] bytes = new String("Estó ès una pruebà \r\n Hola qu€ tal").getBytes(Charset.forName("UTF-8"));
    PrintService service = PrintServiceLookup.lookupDefaultPrintService();
    DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
    DocPrintJob pj = service.createPrintJob();
    Doc doc = new SimpleDoc(bytes, flavor, null);
    pj.print(doc, null);
}

Есть идеи, что может быть не так?

Ответы [ 3 ]

0 голосов
/ 01 июля 2018

Вы должны иметь возможность использовать попытку 2 с одним изменением: при использовании Charset.forName вы не должны передавать UTF-8 в качестве кодировки, а скорее "Cp858" (задано поддерживаемыми кодировками документация по Java). Кодировка должна основываться на кодовой странице, которую ожидает принтер, и тот факт, что источником Java является UTF-8, не имеет отношения к этому преобразованию.

0 голосов
/ 01 июля 2018

Это проблема. Вам нужно будет использовать Unicode, если вы хотите напечатать символ евро и другие символы.

Пример печати символа евро с Unicode

System.out.println("\u20ac");

Однако, проверьте этот вопрос Отображение символа евро с использованием юникода и изменение символов в верхний регистр и взгляните на ответ andrewdotn, это действительно хорошо объяснено.

0 голосов
/ 01 июля 2018

Это проблема кодирования. В кодировке по умолчанию для платформы символ евро должен рассматриваться как символ мусора. Вы должны передать кодировку с этими операциями чтения и записи в качестве меры предосторожности. Прочитайте эту статью: https://www.geeksforgeeks.org/java-io-inputstreamreader-class/

...