lcurses中的宽字符

时间:2012-10-18 12:02:16

标签: lua ncurses luajit

在Lua中使用 lcurses 进行编程时,我注意到相同的代码在 lua luajit 上的运行方式不同(给定源代码存储在UTF-8中:

local locale = os.setlocale('')
require 'curses'

curses.initscr()
curses.cbreak()
curses.echo(0)
curses.nl(0)

local stdscr = curses.stdscr()
stdscr:clear()
stdscr:mvaddstr(0,0,'--->English,')
stdscr:mvaddstr(1,0,'--->Español')
stdscr:mvaddstr(2,0,'--->Русский (Russian)')
stdscr:mvaddstr(3,0,'--->日本語 (Japanese)')
stdscr:refresh()

stdscr:getch()
curses.endwin()

print(locale)

luajit 上运行时,所有内容都按预期打印,但在普通 lua 上,每个UTF-8字符都会变成奇怪的序列:

--->English,
--->EspaM-CM-1ol
--->M-PM- M-Q~CM-Q~AM-Q~AM-PM-:M-PM-8M-PM-9 (Russian)
--->M-f~WM-%M-f~\M-,M-hM-*~^ (Japanese)

这是在具有en_US.UTF-8语言环境的UTF-8感知控制台中的Linux下运行的。另外,我查看了 curses.so ,其中包含 lcurses rock,发现它正在使用正确的 ncurses 库(支持宽字符) :

$ readelf -a curses.so | grep NEEDED
0x00000001 (NEEDED)                     Shared library: [libncursesw.so.5]
0x00000001 (NEEDED)                     Shared library: [libc.so.6]

软件版本:

  • lua 5.1.4
  • luajit 2.0.0 beta7
  • ncurses 5.9
  • lcurses 6-2(从luarocks安装)

修改

问题本身,我从一开始就忘了写:

  • 有人知道为什么会这样吗?
  • 如何让它在普通的lua中工作?

2 个答案:

答案 0 :(得分:1)

标准Lua仅处理ASCII字符。字符串可以包含非ASCII,但Lua不知道如何打印它们。 LuaJIT有special extensions能够处理UTF-8字符串。

答案 1 :(得分:0)

要使用原始utf-8文本,只需在程序开头添加一行:

os.setlocale('')
相关问题