Поддерживает ли Lua Unicode?
Основываясь на приведенной ниже ссылке, я смущен тем, поддерживает ли язык программирования Lua Unicode.
http://lua-users.org/wiki/LuaUnicode
Похоже, что он делает, но имеет ограничения. Я просто не понимаю, есть ли что-то большое или ключевое ограничение или не большое дело?
Ответы
Ответ 1
Вы можете хранить строки unicode в lua, как utf8. Вы можете использовать их, как и любую строку.
Однако Lua не предоставляет никакой поддержки по умолчанию для более высокоуровневых операций с поддержкой unicode в таких строках &mdash, например, подсчета длины строки в символах, преобразования в нижнем и верхнем регистре и т.д. Не имеет ли этого недостатка вы действительно зависите от того, что вы намерены делать с этими строками.
Возможные подходы, в зависимости от вашего использования:
-
Если вы просто хотите вводить/выводить/хранить строки и обычно использовать их как "целые единицы" (для индексирования таблиц и т.д.), вам может не понадобиться какая-либо специальная обработка. В этом случае вы просто рассматриваете эти строки как двоичные капли.
-
Из-за умного дизайна utf8 некоторые типы манипуляций с строками могут выполняться в строках, содержащих utf8, и дают правильный результат без особой осторожности.
Например, вы можете добавлять строки, разделять их отдельно до/после символов ascii и т.д. В качестве примера, если у вас есть строка "開発.txt"
и вы ищете "." в этой строке, используя string.find (string_var, ".")
, а затем разделить ее, используя обычную функцию string.sub
, в "開発"
и ".txt"
, эти строки результата будут правильными строками utf8, даже если вы не используете какой-либо "unicode-aware" ".
Аналогично, вы можете делать case-конверсии только для символов ASCII в строках (те, у которых высокий бит-ноль), и обрабатывать остальную часть строк как двоичные, не закручивая их.
-
Некоторые операции, поддерживающие utf8, настолько просты, что легко просто написать для них свои собственные функции.
Например, чтобы вычислить длину в символах unicode строки, просто подсчитайте количество символов с высоким битом нуль (символы ASCII) и количество символов с двумя верхними битами 11
( "ведущий байты" для символов, отличных от ASCII); длина - это сумма этих двух.
-
Для более сложных операций: например, для преобразования без кода ASCII и т.д., вам, вероятно, придется использовать библиотеку юникода Lua, например, на ранее упомянутой странице Страница Юникода пользователей Lua
Ответ 2
Lua не поддерживает юникод (кроме принятия значения байтов в строках). Однако в библиотеке slnunicode есть много функций строки unicode. Например unicode.utf8.len
.
(примечание: этот ответ полностью украден из комментария grom по другому вопросу - я просто думаю, что он заслуживает собственного ответа)
Ответ 3
Если вы хотите получить короткий ответ, это "да и нет", как указано на связанном сайте.
Lua поддерживает Unicode таким образом, что поддерживается, указывая, сохраняя и запрашивая произвольные байтовые значения в строках, поэтому вы можете хранить любую кодировку в кодировке Unicode в строке Lua.
То, что не поддерживается, - это итерация символом Юникода, стандартная функция для длины строки в символах Юникода и т.д. Таким образом, поддержка Юникода более высокого уровня (например, то, что доступно в Python с длиной, ниже → верхний регистр преобразование, кодирование в произвольном кодировании и т.д.) не доступно.
Ответ 4
Lua 5.3 был выпущен сейчас. Он поставляется с базовой библиотекой UTF-8.
Вы можете использовать библиотеку utf8
для выполнения кодировки UTF-8, например, для получения длины строки UTF-8 (не числа байтов как string.len
), соответствующего каждому символу (а не байтам) и т.д..
Он не содержит встроенную поддержку, отличную от кодировки, например, этот символ является китайским символом?
Ответ 5
Он поддерживает его в том смысле, что вы можете использовать Unicode в строках Lua. Это зависит конкретно от того, что вы планируете делать, но большинство ограничений можно довольно легко обойти, расширяя Lua своими собственными функциями.
Ответ 6
Старый вопрос, но спустя почти 10 лет все еще актуален.
А с 2015 года, с выходом Lua 5.3, ответ на этот вопрос изменился на "да, через встроенную библиотеку utf8
".
В Lua 5.3 это "просто работает":
> a = "何時ですか"
> a
何時ですか
> utf8.len(a)
5
> string.gsub(a, "何","六")
六時ですか 1