You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 12:19:50