Nano Hash - криптовалюты, майнинг, программирование

Преобразование UTF-8 в CP864 (арабский)

У меня следующая задача: текст на смешанном латинско-арабском языке, написанный в UTF-8, нужно преобразовать для печати на POS-принтере, который использует древний однобайтовая кодовая страница 864.

text.getBytes("ibm-864") внезапно показывает много вопросительных знаков вместо арабских символов, и, покопавшись в коде, я понял, что в таблице преобразования есть несколько разных версий арабских символов, используемых для сопоставления с ibm-864 (где-то в диапазоне FExx, а не 06xx, который у меня есть в моем текст).

Я ищу некоторый код или библиотеку, которая может конвертировать арабский юникод в cp864, предпочтительно отображая соответствующие формы арабских символов (в cp864 есть изолированные, начальные, средние и конечные формы для некоторых символов) и, возможно, даже обрабатывать реверс для RTL, потому что я сомневаюсь, что аппаратное обеспечение поддерживает его автоматически.

Я понимаю, что это очень специфическая задача, но почему бы не попробовать? Также я знаю, как это реализовать, но пытаюсь найти готовый к использованию велосипед :)

Кто-нибудь?

Другое возможное решение: библиотека, которая может переводить арабский юникод из диапазона U+0600 - U+06FF Arabic в диапазон U+FE70 - U+FF6F Arabic Presentation Forms-B. Тогда я могу безопасно получить свои байты в cp864. Кто-нибудь видел что-нибудь похожее?

11.03.2015

  • Вы должны использовать Java, как предполагают теги? В противном случае пробовали ли вы использовать стандартную утилиту iconv, чтобы убедиться, что она правильно обрабатывает это преобразование? 11.03.2015
  • Да, у меня есть джава. Я попробую iconv из любопытства, но шансы, что он будет использовать эту таблицу преобразования, высоки, потому что это спецификация: unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP864.TXT 11.03.2015
  • iconv не может справиться с этим, как и ожидалось 11.03.2015
  • Что ж, я подвергся некоторым исследованиям и мучениям и решил свою задачу, но на питоне, который я использовал для предварительной обработки своих данных. Поэтому я не могу разместить ответ на свой вопрос как есть. Если кто-то потом наткнется здесь без понятия куда идти - свяжитесь со мной. Процесс, который я сделал - ручной перевод универсального юникода в контекстные формы + явный BiDi. 16.03.2015
  • ICU поддерживает такой перевод. Вы должны сказать ему, чтобы он использовал непрямое преобразование, чтобы он преобразовывал символы в их формы представления. 09.06.2015

Ответы:


1

Чтобы вывести арабский текст на относительно простое устройство вывода, вам нужно сделать несколько вещей:

  • Разделите текст на блоки разной направленности, используя двунаправленный алгоритм Unicode (UBA), более известный как биди.
  • Зеркальные символы, которые необходимо отразить (например, открывающая скобка указывает в разных направлениях, когда они находятся внутри блоков LTR/RTL)
  • Поскольку устройство вывода не работает, вам нужно изменить символы на их позиционные формы и применить лигатуры там, где это необходимо (есть лигатура для LAM + ALEF). Это делается с помощью программы под названием Arabic Shaper.
  • Вам нужно будет изменить порядок текста в соответствии с их направленностью.
  • Поскольку CP864 не имеет всех позиционных форм для всех символов, вам необходимо преобразовать в резервные формы, преобразовав некоторые окончательные формы в изолированные формы, некоторые медиальные формы в начальные формы и некоторые начальные формы в изолированные формы. Текст не будет перевязываться так хорошо, как если бы были правильные формы, но он подойдет относительно близко.

На Java библиотека ICU позволяет вам сделать это:

  • Bidi ICU может позаботиться о разделении на блоки, зеркалировании и изменении порядка. Изменение порядка может быть выполнено до формирования, поскольку ArabicShaping ICU поддерживает работу с текстом как в логическом (до изменения порядка), так и в визуальном (после изменения порядка) порядке.
  • ArabicShaping ICU может позаботиться о формировании текста, отображая его в соответствующие презентационные формы (диапазон FExx, о котором вы говорили, который не предназначен для обычного использования, он предназначен только для взаимодействия с устаревшим программным/аппаратным обеспечением, в в этом случае принтер понимает CP864, но не Unicode).
  • CharsetProvider и CharsetEncoder ICU можно использовать для преобразования в CP864 с использованием резервного (не кругового) преобразования для символов, которые не входят в выходной набор символов, в данном случае окончательный→изолированный, медиальный→начальный,... формы.
10.06.2015
  • Спасибо за расширенный ответ, буду использовать ICU в будущем. 10.06.2015
  • Не могли бы вы предоставить пример кода того, как это сделать с библиотекой ICU? потому что я пытался искать об этом, но не смог найти образец для этого. 01.02.2021
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..