Как конвертировать UTF-16 в ASCII - PullRequest
5 голосов
/ 20 марта 2011

Я пишу подпрограмму на ассемблере MIPS для преобразования ASCII в UTF-16 и наоборот.Тем не менее, я не смог найти какой-либо хитрости, как преобразовать его.

Спасибо за любые идеи.

Ответы [ 3 ]

6 голосов
/ 20 марта 2011

Псевдокод, предполагая, что ваши байты являются октетами и нулевое завершение не требуется:

Преобразование из ASCII в UTF-16

  1. С учетом входной строки ASCII длиной n (в байтах), последовательно хранимой в памяти по адресу p .
  2. выделить 2 × n байт памяти; пусть начальный адрес этой памяти будет q .
  3. Хотя n больше нуля:
    1. Проверьте, является ли байт в p действительным символом ASCII. Если вы не используете контрольную сумму, самый старший бит должен быть нулем, в противном случае это должна быть правильная контрольная сумма. Выдать ошибку, если байт недействителен.
    2. Нулевое расширение байта в p до 16-битного слова в q . Как это сделать, зависит от набора команд; например, 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. Проверьте, представляет ли 16-разрядное слово в p действительный символ ASCII. Девять старших значащих битов должны быть равны нулю, в противном случае символ не может быть представлен в ASCII. Выдать ошибку, если слово неверно.
    2. Переместить младший значащий байт 16-разрядного слова в p в байт в q .
    3. Если необходимо, добавьте контрольную сумму к байту в q .
    4. Увеличение p на 2.
    5. Увеличение q на 1.
    6. Уменьшение n на 1.
1 голос
/ 20 марта 2011

Термин ASCII не очень специфичен.

ISO-646 является подмножеством Unicode UTF-16. Таким образом, «7-битные» числа ASCII уже Unicode (т.е. вы просто опускаете их в нижнюю часть 16-битного значения), и для другого направления все, что вам нужно сделать, это взять низкий 8 биты из Unicode, чтобы получить ASCII, если вы это имеете в виду.

Если вам нужен ISO-8859-1 (Latin-1), вам понадобится таблица преобразования. Не существует формулы, которая может быть переведена в простые инструкции на языке ассемблера.

1 голос
/ 20 марта 2011

Пока у вас есть только UCS2 (только 16-битные кодовые точки), вы можете преобразовать напрямую в ASCII, выполнив short <-> char -конверсию только для преобразования чисел меньше 128.

...