マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

Lua に渡る「文字列」のエンコーディング

LuaTeX において、Unicode 文字列は UTF-8エンコードされた形で Lua に渡っている。それを確かめる実験。


{\lccode`Z="3042 \lowercase{\gdef\hiraA{Z}}}
\directlua{ local str, pc = "\hiraA", string.char(37)
for i = 1, str:len() do tex.write((pc.."02X"):format(str:byte(i))) end
}
\bye

これをコンパイルすると出力は「E38182」になる。

1 行目では、\lowercase を利用して、符号値 U+3042 の文字トークンのみからなるマクロ \hiraA を定義している。要するに \gdef\hiraA{あ} と同じであるが、入力文字コード(これも UTF-8 である)の影響がないことを明確化するために敢えてこうしている。\directlua の中身は、Lua 文字列 "あ" の各バイト値を 16 進数で出力するものである。結果の「E38182」は U+3042 の UTF-8 表現であるから、LuaUTF-8 のバイト列を受け取ることが判った。