Решение проблемы некорректного добавления функционального знака FNC1

Задача: преобразовать массив текстовых кодов в графические изображения (DataMatrix), корректно добавив функциональный знак FNC1 в начало каждого кода.

Согласно документации, функциональный знак FNC1 в кодировке DataMatrix представляет собой байт со значением 232 (0xE8). Однако при реализации возникают проблемы: после сканирования сгенерированных кодов первым символом отображается не FNC1, а символ "è".

Исходный код и проблема

Используется следующий подход для добавления FNC1:

for code in codes:
    code_bytes = bytes(code, "utf-8")
    
    # Если первый байт не FNC1 (0xE8), добавляем
    if not code_bytes.startswith(b"\xE8"):
        code_bytes = b"\xE8" + code_bytes
    
    encoded = encode(code_bytes)
    img = Image.frombytes("RGB", (encoded.width, encoded.height), encoded.pixels)
    
    # ... дальнейшее сохранение в PDF

Несмотря на это, сканер интерпретирует первый байт как символ "è" (кодировка Latin-1/CP1252 для значения 0xE8), а не как функциональный знак FNC1.

Анализ проблемы

Вероятные причины:

  • Библиотека pylibdmtx может ожидать данные в другом формате или кодировке
  • Символ FNC1 должен добавляться не как сырой байт 0xE8, а через специальный escape-символ ASCII (например, \x1D - разделитель групп)
  • Требуется явное указание режима кодирования GS1 для корректной интерпретации FNC1

Используемые библиотеки

  • json
  • tkinter (Tk, Label, Entry, Button, filedialog, messagebox)
  • pylibdmtx.pylibdmtx (encode)
  • PIL.Image
  • reportlab.pdfgen.canvas
  • reportlab.lib.pagesizes (mm)
  • reportlab.lib.utils (ImageReader)
  • io.BytesIO
  • os.path (basename, splitext)

Формат исходных данных

Коды представлены в виде строк со специальными символами:

"0104603757310758215!&QFA\u001D93gqwy",
"0104603757310758215!aa-\"\u001D93Y2wD",
"0104603757310758215!bUoo\u001D93isPA"

Символ \u001D представляет собой разделитель групп (GS).

Рекомендуемое решение

Для корректного добавления FNC1 необходимо:

  1. Проверить документацию библиотеки pylibdmtx на предмет поддержки GS1 режима
  2. Использовать специальные методы библиотеки для указания FNC1, если они предусмотрены
  3. Рассмотреть альтернативные библиотеки генерации DataMatrix с явной поддержкой GS1
  4. Убедиться, что сканер настроен на интерпретацию первого символа как FNC1, а не как символ кодировки

Проблема требует дополнительного исследования спецификации GS1 DataMatrix и возможностей используемой библиотеки кодирования.