在使用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,并发现它正在使用右ncurses库(支持广泛的字符):
$ readelf -a curses.so | grep NEEDED
0x00000001 (NEEDED) Shared library: [libncursesw.so.5]
0x00000001 (NEEDED) Shared library: [libc.so.6]软件版本:
编辑:
这个问题本身,我从一开始就忘了写:
发布于 2012-10-18 17:34:41
标准Lua只处理ASCII字符。字符串可以包含非ASCII,但是Lua不知道如何打印它们。LuaJIT有特殊扩展可以处理UTF-8字符串.
发布于 2014-09-16 13:01:55
要使用原始的utf-8文本,只需在程序的开头添加一行:
os.setlocale('')https://stackoverflow.com/questions/12954134
复制相似问题