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

时间:2015-03-11 09:20:26

标签: java utf-8 arabic cp864

我有以下任务:用UTF-8编写的混合拉丁语/阿拉伯语中的某些文本需要转换为使用POS打印机打印,后者使用古代one-byte code page 864

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

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

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

任何?

另一种可能的解决方案:可以将unicode arabic从范围U+0600 - U+06FF Arabic转换为范围U+FE70 - U+FF6F Arabic Presentation Forms-B的库。然后我可以安全地在cp864中获取我的字节。有没有人见过什么?

1 个答案:

答案 0 :(得分:2)

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

  • 使用Unicode双向算法(UBA)将文本划分为不同方向性的块,更好地称为Bidi。
  • 需要镜像的镜像字符(例如:当它们位于LTR / RTL块内时,在不同方向打开括号点)
  • 由于输出设备是哑的,您需要将字符更改为其位置形式,并在需要时应用连字(LAM + ALEF有连字)。这是由一个名为阿拉伯塑造者的软件完成的。
  • 您需要根据文字的方向性对文字进行重新排序。
  • 由于CP864没有所有字符的所有位置形式,因此您需要转换为后备形式,将一些最终形式转换为孤立形式,将一些中间形式转换为初始形式,将一些初始形式转换为孤立形式。文本不会像正确的形式那样很好地结合,但它会相对接近。

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

  • ICU的Bidi可以分为块,镜像和重新排序。重新排序可以在整形之前完成,因为ICU的ArabicShaping支持在逻辑(预重新排序)和可视(重新排序后)顺序中处理文本。
  • ICU的ArabicShaping可以处理文本的整形,将其映射到适当的表现形式(您所谈到的FExx系列,这不是正常使用的,它只是用于与传统软件的接口/硬件,在这种情况下是理解CP864而不是Unicode的打印机。
  • ICU的CharsetProvider和CharsetEncoder可用于转换为CP864,使用回退(非往返)转换为不在输出字符集上的字符,在这种情况下是最终→隔离,中间→初始......表单。