UTF-8 到 CP864(阿拉伯语)转换

UTF-8 to CP864 (arabic) conversion

我有以下任务:一些用 UTF-8 编写的混合 latin/arabic 中的文本需要转换为使用 POS 打印机打印,它使用古老的 one-byte code page 864.

text.getBytes("ibm-864") 突然显示许多问号而不是阿拉伯字符,在挖掘代码后我了解到转换 table 有一些不同版本的阿拉伯字符用于映射到 ibm-864(某处在 FExx 范围内,而不是我文本中的 06xx。

我正在寻找一些代码或库,它可以将阿拉伯语 unicode 转换为 cp864,最好映射到阿拉伯语字符的相应形式(在 cp864 中,某些字符有孤立的、初始的、中间的和最终的形式) ,甚至可能为 RTL 处理反向,因为我怀疑硬件是否自动支持它。

我知道这是一项非常具体的任务,但为什么不试一试呢?我也知道如何实现这个,但试图找到一辆现成的自行车:)

有人吗?

另一种可能的解决方案:可以将 unicode 阿拉伯语从范围 U+0600 - U+06FF Arabic 翻译成范围 U+FE70 - U+FF6F Arabic Presentation Forms-B 的库。然后我可以安全地在 cp864 中获取我的字节。有人见过类似的东西吗?

要将阿拉伯语文本输出到相对笨拙的输出设备,您需要做几件事:

  • 使用 Unicode 双向算法 (UBA),更广为人知的 Bidi,将文本分成不同方向的块。
  • 镜像需要镜像的字符(例如:在LTR/RTL块内时左括号指向不同的方向)
  • 由于输出设备是哑的,您需要将字符更改为它们的位置形式,并在需要的地方应用连字(LAM + ALEF 有一个连字)。这是由一款名为 Arabic Shaper 的软件完成的。
  • 您需要根据方向性对文本重新排序。
  • 由于 CP864 没有所有字符的所有位置形式,您需要转换为后备形式,将一些最终形式转换为孤立形式,将一些中间形式转换为初始形式,并将一些初始形式转换为孤立形式形式。文本不会像有适当的形式那样很好地连接,但它会相对接近。

在 Java,ICU 库允许您这样做:

  • ICU 的 Bidi 可以负责分块、镜像和重新排序。重新排序可以在整形之前完成,因为 ICU 的 ArabicShaping 支持以逻辑(预重新排序)和视觉(post-重新排序)顺序处理文本。
  • ICU 的 ArabicShaping 可以负责塑造文本,将其映射到适当的表示形式(你谈到的 FExx 范围,这不是正常使用的,它只是用于与遗留接口software/hardware,在本例中是理解 CP864 但不理解 Unicode 的打印机)。
  • ICU 的 CharsetProvider 和 CharsetEncoder 可用于使用回退(非往返)转换将不在输出字符集中的字符转换为 CP864,在这种情况下为最终→隔离,中间→初始,...表格。