【问题标题】:How to convert UTF-16 to ASCII如何将 UTF-16 转换为 ASCII
【发布时间】:2011-07-18 21:49:51
【问题描述】:

我正在用 MIPS 汇编语言编写一个子程序来将 ASCII 转换为 UTF-16,反之亦然。但是,我找不到任何转换它的技巧。

感谢您的任何想法。

【问题讨论】:

  • 您要转换为 UTF-16 吗? UTF-8?
  • 您的问题标题是“UTF-16 to ASCII”,但您的问题是“ASCII to UTF-16”——哪一个是正确的?
  • 我两者都需要。我反之亦然:)

标签: unicode assembly ascii mips


【解决方案1】:

伪代码,假设您的字节是八位字节并且不需要零终止:

从 ASCII 到 UTF-16 的转换

  1. 给定一个长度为 n(以字节为单位)的 ASCII 输入字符串,按顺序存储在地址 p 的内存中。
  2. 分配 2 × n 字节的内存;让该内存的起始地址为 q
  3. n 大于零时:
    1. 检查 p 处的字节是否是有效的 ASCII 字符。如果不使用校验和,则最高有效位必须为零,否则必须是正确的校验和。如果字节无效,则发出错误。
    2. p 处的字节零扩展为 q 处的 16 位字。如何做到这一点取决于指令集;例如,x86 有MOVZX。您还可以注意正确的字节顺序。
    3. p 增加 1。
    4. q 增加 2。
    5. n 减 1。

从 UTF-16 到 ASCII 的无损转换

  1. 给定一个长度为 n(以代码为单位)的 UTF-16 输入字符串,按顺序存储在地址 p 的内存中。
  2. 分配 n 字节的内存;让该内存的起始地址为 q
  3. n 大于零时:
    1. 检查 p 处的 16 位字是否代表有效的 ASCII 字符。九个最高有效位必须为零,否则字符无法用 ASCII 表示。如果该词无效,则发出错误。
    2. p 处 16 位字的最低有效字节移动到 q 处的字节。
    3. 如果需要,将校验和添加到 q 处的字节。
    4. p 增加 2。
    5. q 增加 1。
    6. n 减 1。

【讨论】:

    【解决方案2】:

    ASCII这个词不是很具体。

    ISO-646 是 Unicode UTF-16 的子集。所以“7 位”ASCII 数字 已经 Unicode(即您只需将它们放到 16 位值的底部),而对于另一个方向,您所要做的就是取低如果这是您的意思,从 Unicode 获取 8 位 ASCII。

    另一方面,如果您需要 ISO-8859-1 (Latin-1),则需要一个转换表。汇编语言中没有可以翻译成简单指令的公式。

    【讨论】:

    • 我应该从 Unicde 取低 16 位还是 7 位?
    • 好吧,ASCII 到 UTF-16 呢?
    • 每个 ASCII 字符都转换为 UTF-16 字符,高字节为 0。
    • 您也不需要 ISO-8859-1 的转换表,因为底部的 256 个 Unicode 字符与 ISO-8859-1 字符集完全相同。因此,从 ISO-8859-1 到 UTF-16 的转换与 ASCII 的情况一样简单:获取字节,并在每个字节之后插入一个空字节。
    • 没有。不对。只有 ISO-646 是相同的,不是 latin-1。
    【解决方案3】:

    只要您只有 UCS2(只有 16 位代码点),您就可以通过 short <-> char-conversion 仅转换小于 128 的数字来直接转换为 ASCII。

    【讨论】:

    • 不,这不是我要找的。我需要在汇编级别进行转换。
    • 嗯,你应该知道如何在你的平台上复制字节:) 如果它是 Big Endian 或 Little Endian。如果是 Big Endian,则需要复制第二个字节,如果是 Little Endian,则需要复制第一个字节。
    • 这与 UCS-2 没有太大关系。只能无损地将后 128 位字符从 Unicode 转换为 ASCII,所有这些都在 BMP 中。
    • 好吧,如果你想转换 UTF-16,你必须转换 BMP 之外的代码点,它们是 32 位长,不同的是,这就是为什么我的解决方案只对 UCS-2 有效。
    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 2015-09-21
    • 2010-12-02
    • 2015-09-19
    • 2019-05-15
    • 2016-07-23
    • 2019-10-31
    相关资源
    最近更新 更多