2011-10-15 34 views

Respuesta

5

¿Qué tal

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 
+0

No entiendo cómo responde esto a su propia pregunta. ¿De verdad solo preguntabas cómo formatear un número hexadecimal con un '\ u' al frente? –

+0

pregunta titulada - "¿cuál es la forma de * representar * un unichar en lua"? En realidad, necesitaba la función lua para producir lo mismo que el script python equivalente, ya que uno viene a reemplazar el otro. Aparentemente, esto es suficiente. –

10

No hay ninguna.

Lua no tiene ningún concepto de valor Unicode. Lua no tiene concepto de Unicode en absoluto. Todas las cadenas Lua son secuencias de 8 bits de "caracteres", y todas las funciones de cuerdas Lua las tratarán como tales. Lua no considera que las cadenas tengan ninguna codificación Unicode; solo son una secuencia de bytes.

Puede insertar un número arbitrario en una cadena. Por ejemplo:

"\065\066" 

es equivalente a:

"AB" 

La notación \ es seguido por 3 dígitos (o uno de los caracteres de escape), que debe ser menor o igual a 255. Lua es perfectamente capaz de manejar cadenas con caracteres incrustados \000.

Pero no puede insertar directamente los puntos de código Unicode en cadenas Lua. Puede descomponer el punto de código en UTF-8 y usar el mecanismo anterior para insertar el punto de código en una cadena. Por ejemplo:

"x\226\131\151" 

Este es el carácter x seguido por el Unicode combining above arrow character.

Pero como ninguna función Lua realmente comprende UTF-8, tendrá que exponer alguna función que espere una cadena UTF-8 para que sea útil de alguna manera.

3

Si bien Lua nativo no admite ni maneja Unicode directamente, sus cadenas son realmente buffers de bytes arbitrarios que por convención contienen caracteres ASCII. Dado que las cadenas pueden contener valores de bytes, es relativamente sencillo crear soporte para Unicode sobre cadenas nativas. Si los almacenamientos intermedios de bytes no son lo suficientemente robustos para este fin, también se puede usar un objeto userdata para contener cualquier cosa, y con la adición de un metatabla adecuado, dotarlo de métodos para la creación, traducción a una codificación deseada, concatenación, iteración y cualquier otra cosa que se necesite

Hay a page at the Lua User's Wiki que analiza varias formas de manejar Unicode en programas Lua.

2

Para una respuesta más moderna, Lua 5.3 tiene ahora la utf8.char:

obtiene cero o más enteros, convierte cada uno a su correspondiente secuencia de bytes UTF-8 y devuelve una cadena con la concatenación de todas estas secuencias.

Cuestiones relacionadas