LuaTeX输出部分Unicode字符显示为问号的技术求助
Ubuntu 22.04下LaTeX调用Octave输出Unicode字符变问号的问题排查与解决
问题原因
- 编码环境未继承:Ubuntu 22.04中,通过Lua的
io.popen调用Octave时,子进程未继承终端的UTF-8编码环境变量,导致Octave输出的Unicode字符被转换为非UTF-8编码,Lua读取后无法正确解析,最终显示为问号。 - Lua字符处理逻辑变更:Ubuntu 22.04配套的Lua版本与18.04存在差异,默认字符串编码处理逻辑改变,直接传递原始输出给
tex.print时无法识别Unicode字符。
解决办法
1. 强制Octave输出UTF-8编码
修改Lua脚本,在调用命令前添加编码环境变量,确保Octave以UTF-8编码输出内容:
\\begin{luacode*} function run_octave_script(octavescript) local command = "LC_ALL=en_US.UTF-8 " .. os.getenv("HOME") .. " " .. octavescript local outputfile = io.popen(command) local outputtext = outputfile:read("*all") outputfile:close() for line in outputtext:gmatch("[^\n]+") do tex.print(line) tex.print("") end end \\end{luacode*}
2. 明确LaTeX文档编码配置
确保LaTeX文档开头指定UTF-8编码,配合fontspec正确加载包含目标Unicode字符的字体:
\\documentclass{article} \\usepackage{fontspec} \\usepackage{tcolorbox} \\usepackage{luacode}
3. 优化Lua字符串读取逻辑
若仍有问题,在Lua中按二进制模式读取输出后显式转UTF-8解码:
\\begin{luacode*} function run_octave_script(octavescript) local command = "LC_ALL=en_US.UTF-8 " .. os.getenv("HOME") .. " " .. octavescript local outputfile = io.popen(command, "r") local outputtext = outputfile:read("*a") outputtext = utf8.decode(outputtext) outputfile:close() for line in outputtext:gmatch("[^\n]+") do tex.print(line) tex.print("") end end \\end{luacode*}
4. 系统级编码验证与配置
在终端执行以下命令,确保系统默认编码为UTF-8:
sudo locale-gen en_US.UTF-8 sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
执行后重启终端,再重新运行LaTeX编译命令。
内容的提问来源于stack exchange,提问作者nightcod3r
相关产品推荐
相关产品推荐

