2011-10-15 2 views

Répondre

5

Que diriez-vous

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

Je ne comprends pas comment cela répond à votre propre question. Avez-vous vraiment demandé comment formater un nombre hexadécimal avec un '\ u' devant? –

+0

question intitulée - "comment représenter * unichar in lua" - en fait, j'avais besoin de la fonction lua pour produire la même chose que le script python équivalent puisque l'un venait remplacer l'autre. Apparemment, c'est juste assez. –

10

Il n'y en a pas.

Lua n'a pas de concept de valeur Unicode. Lua n'a aucun concept de Unicode du tout. Toutes les chaînes Lua sont des séquences de 8 caractères, et toutes les fonctions de la chaîne Lua les traitent comme telles. Lua ne traite pas les chaînes comme ayant un encodage Unicode; ils sont juste une séquence d'octets.

Vous pouvez insérer un nombre arbitraire dans une chaîne. Par exemple:

"\065\066" 

équivaut à:

"AB" 

La notation \ est suivi de 3 chiffres (ou l'un des caractères d'échappement), qui doit être inférieur ou égal à 255. Lua est parfaitement capable de gérer les chaînes avec \000 caractères.

Mais vous ne pouvez pas directement insérer des points de code Unicode dans les chaînes Lua. Vous pouvez décomposer le code en UTF-8 et utiliser le mécanisme ci-dessus pour insérer le code dans une chaîne. Par exemple:

"x\226\131\151" 

C'est le caractère x suivi du Unicode combining above arrow character. Mais comme aucune fonction Lua ne comprend réellement UTF-8, vous devrez exposer une fonction qui attend une chaîne UTF-8 pour qu'elle soit utile de quelque façon que ce soit.

3

Alors que Lua natif ne supporte pas ou ne gère pas Unicode directement, ses chaînes sont en réalité des tampons d'octets arbitraires qui, par convention, contiennent des caractères ASCII. Comme les chaînes peuvent contenir des valeurs d'octets, il est relativement simple de créer un support pour Unicode au-dessus des chaînes natives. Si les buffers d'octets s'avèrent insuffisamment robustes, on peut aussi utiliser un objet userdata pour contenir quoi que ce soit, et avec l'ajout d'un méta approprié, doter celui-ci de méthodes de création, traduction en un encodage, concaténation, itération, et tout ce qui est nécessaire.

Il existe a page at the Lua User's Wiki qui décrit différentes manières de gérer Unicode dans les programmes Lua.

2

Pour une réponse plus moderne, Lua 5.3 a maintenant la utf8.char:

Reçoit zéro entiers ou plus, convertit chacun à sa séquence UTF-8 octets correspondant et renvoie une chaîne avec la concaténation de toutes ces séquences.

Questions connexes