UTF-8 到 CP864(阿拉伯语)的转换 [英] UTF-8 to CP864 (arabic) conversion

查看:33
本文介绍了UTF-8 到 CP864(阿拉伯语)的转换的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下任务:需要转换一些以 UTF-8 编写的拉丁/阿拉伯混合文本,以便使用 POS 打印机进行打印,该打印机使用古老的 一字节代码页 864.

I have the following task: some text in mixed latin/arabic written in UTF-8 needs to be converted for printing using POS-printer, which uses ancient one-byte code page 864.

text.getBytes("ibm-864") 突然显示很多问号而不是阿拉伯字符,挖了代码才明白转换表有一些不同版本的阿拉伯字符用来映射到 ibm-864(在 FExx 范围内的某个地方,而不是我在文本中提到的 06xx).

text.getBytes("ibm-864") suddenly shows many question marks instead of arabic characters, and after digging the code I understood that conversion table has some different versions of arabic characters used to map to ibm-864 (somewhere in the FExx range rather than 06xx, which I have in my text).

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

I'm looking for some code or library, which can convert arabic unicode to cp864, preferrably mapping to the corresponding forms of arabic chars (in cp864 there're isolated, initial, medial and final forms for some chars), and maybe even handling reverse for RTL, because I doubt that hardware supports it automatically.

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

I understand that this is very specific task, but why don't give it a try? Also I know how to implement this, but trying to find a ready-to-use bicycle :)

有人吗?

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

Another possible solution: library that can translate unicode arabic from the range U+0600 - U+06FF Arabic to the range U+FE70 - U+FF6F Arabic Presentation Forms-B. Then I can safely get my bytes in cp864. Have anyone seen anything alike?

推荐答案

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

To output arabic text to a relatively dumb output device, you'll need to do several things:

  • 使用 Unicode 双向算法 (UBA)(俗称 Bidi)将文本分成不同方向的块.
  • 镜像需要镜像的字符(例如:当它们在 LTR/RTL 块内时,左括号指向不同的方向)
  • 由于输出设备是愚蠢的,您需要将字符更改为它们的位置形式,并在需要的地方应用连字(LAM + ALEF 有一个连字).这是由一个名为阿拉伯语 Shaper 的软件完成的.
  • 您需要根据文本的方向重新排列文本.
  • 由于 CP864 没有所有字符的所有位置形式,您需要转换为回退形式,将一些最终形式转换为孤立形式,将一些介词形式转换为初始形式,将一些初始形式转换为孤立形式.文本不会像有适当的形式一样很好地连接,但它会相对接近.

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

On Java, the ICU library allows you to do that:

  • ICU 的 Bidi 可以负责划分块、镜像和重新排序.重新排序可以在整形之前完成,因为 ICU 的阿拉伯整形支持以逻辑(重新排序前)和视觉(重新排序后)顺序处理文本.
  • ICU 的ArabicShaping 可以负责塑造文本,将其映射成适当的表现形式(你说的FExx 系列,不是用来正常使用的,它只是用来和遗留软件交互的/硬件,在这种情况下是理解 CP864 但不理解 Unicode 的打印机).
  • ICU 的 CharsetProvider 和 CharsetEncoder 可用于对不在输出字符集上的字符使用回退(非往返)转换转换为 CP864,在这种情况下,最终→隔离、中间→初始...形式.

这篇关于UTF-8 到 CP864(阿拉伯语)的转换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆