在 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)
这是在 Linux 下使用 en_US.UTF-8 语言环境在 UTF-8 感知控制台中运行的。我还研究了lcurses rock附带的curses.so,发现它使用的是正确的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
- 诅咒 5.9
- lcurses 6-2(从 luarocks 安装)
编辑:
问题本身,我从一开始就忘记写了:
- 有人知道为什么会这样吗?
- 如何让它在普通的lua中工作?