2016-08-18 3 views
2

Я пытаюсь выровнять строку с символами Unicode.
Но это не работает.
Неверные места. :(версия
Lua является 5,1.
В чем проблема?
Форматирование строк с помощью символов Unicode с использованием Lua

local t = 
{ 
    "character", 
    "루아",   -- korean 
    "abc감사합니다123", -- korean 
    "ab23", 
    "lua is funny", 
    "ㅇㅅㅇ", 
    "美國大將",   --chinese 
    "qwert-54321", 
}; 

for k, v in pairs(t) do 
    print(string.format("%30s", v)); 
end 


result:---------------------------------------------- 
        character 
         루아 
      abc감사합니다123 
          ab23 
        lua is funny 
         ㅇㅅㅇ 
        美國大將 
        qwert-54321 
+0

Форматирование символов Юникода может быть сложным, потому что каждый символ принимает не только переменное количество байтов при кодировании, но и при отображении числа переменных в столбце переменной. Выполняя быстрый поиск по Luarocks, библиотека [wcwidth] (https://luarocks.org/modules/aperezdc/wcwidth) выглядит так, как будто она подходит для того, что вы пытаетесь сделать. – hugomg

ответ

2

ASCII-строки все правильно отформатирован, в то время как строки не-ASCII нет.

Причина в том, что, длина строки отсчитывается с их количеством байт. например, с UTF-8 кодировкой,

print(string.len("美國大將")) -- 12 
print(string.len("루아"))  -- 6 

So %s в string.format рассматривать эти две строки, как если их ширина составляет 12/6.

+0

Спасибо Ю. понят. : D – ddubie

0
function utf8format(fmt, ...) 
    local args, strings, pos = {...}, {}, 0 
    for spec in fmt:gmatch'%%.-([%a%%])' do 
     pos = pos + 1 
     local s = args[pos] 
     if spec == 's' and type(s) == 'string' and s ~= '' then 
     table.insert(strings, s) 
     args[pos] = '\1'..('\2'):rep(#s:gsub("[\128-\191]", "")-1) 
     end 
    end 
    return (fmt:format((table.unpack or unpack)(args)) 
     :gsub('\1\2*', function() return table.remove(strings, 1) end) 
    ) 
end 

local t = 
{ 
    "character", 
    "루아",   -- korean 
    "abc감사합니다123", -- korean 
    "ab23", 
    "lua is funny", 
    "ㅇㅅㅇ", 
    "美國大將",   --chinese 
    "qwert-54321", 
    "∞" 
}; 

for k, v in pairs(t) do 
    print(utf8format("%30s", v)); 
end 

Но есть еще одна проблема: в большинстве шрифтов корейские и китайские символы шире, чем латинские буквы.

Смежные вопросы