如何将 UTF-16 与 ASCII 相互转换

发布于 2024-10-24 03:13:42 字数 69 浏览 7 评论 0原文

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

I'm writing a subroutine in MIPS assembly language to convert ASCII into UTF-16 and vice versa. However, I could not find any trick how to convert it.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

坠似风落 2024-10-31 03:13:42

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

从 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. 给定 UTF-16 输入, 长度为 n 的字符串(以代码单元为单位)按顺序存储在内存中的地址 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。

Pseudocode, assuming that your bytes are octets and that no zero termination is required:

Conversion from ASCII to UTF-16

  1. Given an ASCII input string of length n (in bytes) stored sequentially in memory at address p.
  2. Allocate 2 × n bytes of memory; let the start address of that memory be q.
  3. While n is larger than zero:
    1. Check whether the byte at p is a valid ASCII character. If you don't use checksumming, the most significant bit has to be zero, otherwise it has to be the correct checksum. Issue an error if the byte is not valid.
    2. Zero-extend the byte at p to the 16-bit word at q. How this is done depends on the instruction set; e.g., x86 has MOVZX. You may also pay attention to the correct endianness.
    3. Increment p by 1.
    4. Increment q by 2.
    5. Decrement n by 1.

Lossless conversion from UTF-16 to ASCII

  1. Given an UTF-16 input string of length n (in code units) stored sequentially in memory at address p.
  2. Allocate n bytes of memory; let the start address of that memory be q.
  3. While n is larger than zero:
    1. Check whether the 16-bit word at p represents a valid ASCII character. The nine most significant bits have to be zero, otherwise the character is not representable in ASCII. Issue an error if the word is not valid.
    2. Move the least significant byte of the 16-bit word at p to the byte at q.
    3. If required, add a checksum to the byte at q.
    4. Increment p by 2.
    5. Increment q by 1.
    6. Decrement n by 1.
傲影 2024-10-31 03:13:42

术语 ASCII 并不是很具体。

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

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

The term ASCII is not very specific.

ISO-646 is a subset of Unicode UTF-16. So '7-bit' ASCII numbers are already Unicode (i.e. you just drop them into the bottom of a 16 bit value), and, for the other direction, all you have to do is take the low 8 bits from Unicode to get the ASCII if this is what you mean.

If you need, on the other hand, ISO-8859-1 (Latin-1), you'll need a conversion table. There is no formula that can be translated into simple instructions in assembly language.

吹泡泡o 2024-10-31 03:13:42

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

As long as you only have UCS2 (only 16-bit codepoints) you can convert directly to ASCII by doing a short <-> char-conversion only converting numbers smaller than 128.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文