2011-11-02 16 views
6

में यूनिकोड प्रतीक कैसे लिखें, मैं लूआ में यूनिकोड प्रतीक कैसे लिख सकता हूं। उदाहरण के लिए जब मैंलुआ

string.char(9658); 

बारे में मैं एक त्रुटि मिला 9658
साथ प्रतीक लिखने के लिए की है। तो ऐसे प्रतीक को लिखना कैसे संभव है।

+1

यह पता है कि आप में जिसके परिणामस्वरूप स्ट्रिंग चाहते एन्कोडिंग मदद मिलेगी – MattJ

उत्तर

12

लुआ अंदर तार नहीं लगती है। तो, आप बस लिख सकते हैं

mychar = "►" 

(2015 में) जोड़ा

लुआ 5.3 UTF-8 भागने दृश्यों के लिए शुरू की समर्थन:

UTF-8 यूनिकोड वर्ण की एन्कोडिंग हो सकता है एस्केप अनुक्रम \ यू {XXX} (ध्यान दें अनिवार्य संलग्नित कोष्ठक), जहां XXX एक या अधिक षोडश आधारी चरित्र कोड बिंदु का प्रतिनिधित्व अंक का एक क्रम है के साथ एक शाब्दिक स्ट्रिंग में डाला।

आप utf8.char(9658) का भी उपयोग कर सकते हैं।

+2

ध्यान दें कि यह केवल तभी काम करेगा यदि फ़ाइल स्वयं यूटीएफ -8 एन्कोडेड है। बेशक, आप दुभाषिया पर लुआ लिपि को तब तक नहीं फेंक सकते जब तक कि यह एएससीआईआई या यूटीएफ -8 नहीं है। –

2

हो सकता है कि यह आपकी मदद कर सकते हैं:

function FromUTF8(pos) 
    local mod = math.mod 
    local function charat(p) 
    local v = editor.CharAt[p]; if v < 0 then v = v + 256 end; return v 
    end 
    local v, c, n = 0, charat(pos), 1 
    if c < 128 then v = c 
    elseif c < 192 then 
    error("Byte values between 0x80 to 0xBF cannot start a multibyte sequence") 
    elseif c < 224 then v = mod(c, 32); n = 2 
    elseif c < 240 then v = mod(c, 16); n = 3 
    elseif c < 248 then v = mod(c, 8); n = 4 
    elseif c < 252 then v = mod(c, 4); n = 5 
    elseif c < 254 then v = mod(c, 2); n = 6 
    else 
    error("Byte values between 0xFE and OxFF cannot start a multibyte sequence") 
    end 
    for i = 2, n do 
    pos = pos + 1; c = charat(pos) 
    if c < 128 or c > 191 then 
     error("Following bytes must have values between 0x80 and 0xBF") 
    end 
    v = v * 64 + mod(c, 64) 
    end 
    return v, pos, n 
end 
+2

मैं 'यकीन है कि समारोह में वह क्या चाहता है के विपरीत है कि हूँ। उनके पास यूनिकोड कोडपॉइंट है कि वह यूटीएफ -8 में एन्कोड करना चाहता है। –

+0

विपरीत भी एक लंबा रास्ता तय कर सकते हैं! :) –

2

यूनिकोड स्ट्रिंग सामग्री के लिए व्यापक समर्थन प्राप्त करने के लिए, एक दृष्टिकोण slnunicode जो Selene डेटाबेस पुस्तकालय के हिस्से के रूप में विकसित किया गया है। यह आपको एक मॉड्यूल देगा जो मानक string लाइब्रेरी के अधिकांश का समर्थन करता है, लेकिन यूनिकोड वर्ण और यूटीएफ -8 एन्कोडिंग के साथ।

3

यहाँ है कि एक यूनिकोड कोड बिंदु लेता है और इसी किरदार के लिए एक UTF-8 स्ट्रिंग का उत्पादन लुआ के लिए एक एनकोडर है:।

do 
    local bytemarkers = { {0x7FF,192}, {0xFFFF,224}, {0x1FFFFF,240} } 
    function utf8(decimal) 
    if decimal<128 then return string.char(decimal) end 
    local charbytes = {} 
    for bytes,vals in ipairs(bytemarkers) do 
     if decimal<=vals[1] then 
     for b=bytes+1,2,-1 do 
      local mod = decimal%64 
      decimal = (decimal-mod)/64 
      charbytes[b] = string.char(128+mod) 
     end 
     charbytes[1] = string.char(vals[2]+decimal) 
     break 
     end 
    end 
    return table.concat(charbytes) 
    end 
end 

c=utf8(0x24) print(c.." is "..#c.." bytes.") --> $ is 1 bytes. 
c=utf8(0xA2) print(c.." is "..#c.." bytes.") --> ¢ is 2 bytes. 
c=utf8(0x20AC) print(c.." is "..#c.." bytes.") --> € is 3 bytes. 
c=utf8(0x24B62) print(c.." is "..#c.." bytes.") --> is 4 bytes.