2011-10-15 15 views

Odpowiedz

5

Jak o

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

Nie rozumiem, jak to odpowiada na twoje własne pytanie. Czy naprawdę zapytałeś się, jak sformatować liczbę szesnastkową z "\ u" przed nią? –

+0

pytanie zatytułowane - "w jaki sposób * reprezentować * a unichar in lua" - faktycznie potrzebowałem funkcji lua, aby wypisać to samo, co odpowiadający skrypt Pythona, ponieważ jeden przychodzi, aby zastąpić drugi. Najwyraźniej to wystarczy. –

10

Nie ma.

Lua nie ma pojęcia wartości Unicode. Lua nie ma pojęcia o Unicode w ogóle. Wszystkie ciągi Lua są 8-bitowymi sekwencjami "znaków", a wszystkie ciągi znaków Lua traktują je jako takie. Lua nie traktuje łańcuchów jako posiadających kodowanie Unicode; to tylko sekwencja bajtów.

Możesz wstawić dowolną liczbę do ciągu znaków. Np

"\065\066" 

jest równoważna:

"AB" 

Zapis \ następują 3 cyfr (lub jednej z postaci wyjścia), które muszą być mniejsze niż lub równe 255 Lua doskonale nadaje się do obsługi ciągów znaków z wbudowanymi znakami \000.

Ale nie można bezpośrednio wstawiać punktów kodowych Unicode do ciągów Lua. Możesz odłożyć punkt kodowy do UTF-8 i użyć powyższego mechanizmu, aby wstawić punkt kodowy do ciągu. Na przykład:

"x\226\131\151" 

Jest to postać x następnie Unicode combining above arrow character.

Ale ponieważ żadna z funkcji Lua faktycznie nie rozpoznaje UTF-8, musisz ujawnić jakąś funkcję, która oczekuje ciągu znaków UTF-8, aby był użyteczny w jakikolwiek sposób.

3

Podczas gdy natywna Lua nie obsługuje bezpośrednio ani nie obsługuje Unicode, jego łańcuchy są tak naprawdę buforami arbitralnych bajtów, które zgodnie z konwencją przechowują znaki ASCII. Ponieważ łańcuchy mogą zawierać dowolne wartości bajtów, stosunkowo proste jest budowanie obsługi standardu Unicode na natywnych łańcuchach. Jeśli bufory bajtów okażą się niewystarczająco mocne do tego celu, można również użyć obiektu o dowolnej wartości, a dodając odpowiedni metatabel, należy podać metody tworzenia, tłumaczenie do pożądanego kodowania, konkatenacji, iteracji i wszystko, co jest potrzebne.

Istnieje a page at the Lua User's Wiki, który omawia różne sposoby obsługi Unicode w programach Lua.

2

Dla bardziej nowoczesny odpowiedź, Lua 5.3 ma teraz utf8.char:

Odbiera zero lub więcej liczb całkowitych, konwertuje każdy swoją analogicznym UTF-8 sekwencji bajtów i zwraca ciąg znaków z połączeniem wszystkich tych sekwencji.

Powiązane problemy