2016-08-18 9 views
2

文字列をUnicode文字に整列しようとしています。
しかし、動作しません。
スペースが正しくありません。 :(
のLuaのバージョンは5.1である。
問題は何ですか?
Luaを使用したUnicode文字による文字書式設定

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

Unicode文字の書式設定は、各文字がエンコード時に可変バイト数を取るだけでなく、表示時に可変数の列を使い切るため、扱いにくいことがあります。 Luarocksのクイック検索を行うと、[wcwidth](https://luarocks.org/modules/aperezdc/wcwidth)ライブラリは、あなたがやろうとしているものと関連があるようです。 – hugomg

答えて

2

ASCII文字列がすべて正しくフォーマットされ、非ASCII文字列ではないながら。

理由がある、なぜなら文字列の長さは、バイトのそれらの数でカウントされている。例えば、UTF-8エンコーディング、で

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

だから%sとほとんどのフォントに韓国語、中国語の記号はラテン文字よりも幅が広い:その幅は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 

である。しかし、別の問題があるかのようには、これら2つの文字列を扱います。

関連する問題