2

Lua でlcursesを使ったプログラミングを始めているときに、同じコードがlualuajitで異なる動作をすることに気付きました(ソースが 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 で実行されました。また、 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]

ソフトウェアのバージョン:

  • ルア 5.1.4
  • luajit 2.0.0 beta7
  • ncurses 5.9
  • lcurses 6-2 (luarocks からインストール)

編集:

最初から書き忘れていた質問自体:

  • なぜこれが起こるのか誰か知っていますか?
  • プレーンなルアで動作させるには?
4

2 に答える 2

1

標準 Lua は ASCII 文字のみを扱います。文字列には非 ASCII を含めることができますが、Lua はそれらを出力する方法を知りません。LuaJIT には、UTF-8 文字列を処理できる特別な拡張機能があります。

于 2012-10-18T17:34:41.373 に答える
0

生の utf-8 テキストを使用するには、プログラムの先頭に 1 行追加するだけです。

os.setlocale('')
于 2014-09-16T13:01:55.080 に答える