что такое способ представлять Unichar в Луа - PullRequest
9 голосов
/ 15 октября 2011

Если мне нужно иметь следующее значение python, unicode char '0':

>>> unichr(0)
u'\x00'

Как я могу определить это в Lua?

Ответы [ 4 ]

10 голосов
/ 16 октября 2011

Нет ни одного.

Lua не имеет понятия о значении Unicode. Lua вообще не имеет понятия Unicode . Все строки Lua являются 8-битными последовательностями «символов», и все строковые функции Lua будут обрабатывать их как таковые. Lua не рассматривает строки как имеющие кодировку Unicode; это просто последовательность байтов.

Вы можете вставить произвольное число в строку. Например:

"\065\066"

Эквивалентно:

"AB"

За обозначением \ следуют 3 цифры (или один из escape-символов), которые должны быть меньше или равны 255. Lua прекрасно справляется со строками со встроенными символами \000.

Но вы не можете напрямую вставлять кодовые точки Unicode в строки Lua. Вы можете разложить кодовую точку на UTF-8 и использовать вышеупомянутый механизм для вставки кодовой точки в строку. Например:

"x\226\131\151"

Это символ x, за которым следует Юникод, объединяющий вышеуказанный символ стрелки .

Но так как никакие функции Lua на самом деле не понимают UTF-8, вам придется предоставить некоторую функцию, которая ожидает строку UTF-8, чтобы она была полезна в любом случае.

5 голосов
/ 18 октября 2011

Как насчет

function unichr(ord)
    if ord == nil then return nil end
    if ord < 32 then return string.format('\\x%02x', ord) end
    if ord < 126 then return string.char(ord) end
    if ord < 65539 then return string.format("\\u%04x", ord) end
    if ord < 1114111 then return string.format("\\u%08x", ord) end
end
3 голосов
/ 17 октября 2011

Хотя нативный Lua напрямую не поддерживает и не обрабатывает Unicode, его строки на самом деле являются буферами произвольных байтов, которые по соглашению содержат символы ASCII. Поскольку строки могут содержать любые байтовые значения, относительно просто встроить поддержку Unicode поверх собственных строк. Если байтовые буферы оказываются недостаточно надежными для этой цели, можно также использовать объект userdata для хранения чего-либо, и с добавлением подходящего метатаблицы наделить его методами для создания, преобразования в требуемое кодирование, конкатенации, итерации и все остальное, что нужно.

В Wiki пользователя Lua есть страница , на которой обсуждаются различные способы работы с Юникодом в программах Lua.

2 голосов
/ 26 июля 2015

Для более современного ответа Lua 5.3 теперь имеет utf8.char:

Получает ноль или более целых чисел, преобразует каждое из них в свою соответствующую последовательность байтов UTF-8и возвращает строку с объединением всех этих последовательностей.

...