From b5bf1125dba6d4e5e13ff2892b5ff736eb50f7ce Mon Sep 17 00:00:00 2001 From: Michael Billington Date: Sun, 11 Sep 2016 17:17:22 +1000 Subject: [PATCH] reverse the lookup order to correct encoding issues --- src/escpos/magicencode.py | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/escpos/magicencode.py b/src/escpos/magicencode.py index b36b844..3a545b7 100644 --- a/src/escpos/magicencode.py +++ b/src/escpos/magicencode.py @@ -17,6 +17,7 @@ from __future__ import division from __future__ import print_function from __future__ import unicode_literals +from builtins import bytes, chr from .constants import CODEPAGE_CHANGE from .exceptions import CharCodeError, Error from .capabilities import get_profile @@ -66,17 +67,22 @@ class Encoder(object): return encoding def can_encode(self, encoding, char): - try: - encoded = CodePages.encode(char, encoding) - assert type(encoded) is bytes - return encoded - except LookupError: - # We don't have this encoding - return False - except UnicodeEncodeError: - return False + # Compute the encodable characters in the upper half of this code page + encodable_chars = [u" "] * 128 + for i in range(0, 128): + codepoint = i + 128 + try: + encodable_chars[i] = bytes([codepoint]).decode(encoding) + except UnicodeDecodeError: + # Non-encodable character + pass + except LookupError: + # We don't have this encoding + return False - return True + # Decide whether this character is encodeable in this code page + is_ascii = ord(char) < 128 + return is_ascii or char in encodable_chars def __encoding_sort_func(self, item): key, index = item