Lua中使用UTF8字符的string.format

如何在包含UTF-8字符的字符串中使用string.format时获得“正确”的格式?

示例:

local str = "\xE2\x88\x9E"
print(utf8.len(str), string.len(str))
print(str)
print(string.format("###%-5s###", str))
print(string.format("###%-5s###", 'x'))

输出:

1   3
∞
###∞  ###
###x    ###

看起来string.format使用无穷符号的字节长度而不是“字符长度”。 是否有一个UTF-8string.format等价的函数?

点赞
用户2546626
用户2546626

Lua 在版本 5.3 中添加了 UTF-8 库,仅提供了最基本的功能。这个库是“新鲜”的,不是这门语言的重点。你的问题是如何解释和呈现字符,但是图形不是 Lua 标准库或常规使用的重点。

现在,您应该只需要为输入修复模式。

2016-03-10 11:00:50
用户1847592
用户1847592
function utf8.format(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(utf8.len(s)-1)
      end
   end
   return (
      fmt:format(table.unpack(args))
         :gsub('\1\2*', function() return table.remove(strings, 1) end)
   )
end

local str = "\xE2\x88\x9E"
print(string.format("###%-5s###", str))  --> ###∞  ###
print(string.format("###%-5s###", 'x'))  --> ###x    ###
print(utf8.format  ("###%-5s###", str))  --> ###∞    ###
print(utf8.format  ("###%-5s###", 'x'))  --> ###x    ###

将提供的 Lua 代码复制到脚本中使用可以解决中文字符集无法对齐输出的问题。这个脚本实现了一个用于格式化字符串的函数 utf8.format,可用于替代原生的 string.format 函数。在输出字符串时,它可以检查字符串中的字符集,保证每个字符都占据相同的宽度,从而实现对齐输出。

2016-03-10 13:34:12