LuaLaTeX - 包含无效 utf-8 序列的字符串
我正在 Linux Debian 上尝试通过提取来自我的数据库 linux_krozki 的一些信息来打印 PDF。为此,我首先创建了带有 utf8mb4 字符集和 utf8mb4_slovenian_ci 排序规则的数据库。
我没有使用基于 此主题 的 utf8 字符集和 utf8_slovenian_ci。
MariaDB [(none)]> SHOW CREATE DATABASE linux_krozki;
+--------------+-------------------------------------------------------------------------------------------------------+
| 数据库 | 创建数据库 |
+--------------+-------------------------------------------------------------------------------------------------------+
| linux_krozki | CREATE DATABASE `linux_krozki` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_slovenian_ci */ |
+--------------+-------------------------------------------------------------------------------------------------------+
所以现在我用如下的信息填充了数据库表格 skupine - 请注意在列 opombe 中的字母 ž:
当我使用 LuaLaTeX 与 LuaSQL 结合编译 PDF 文档时,由于该字符 ž,我会收到以下错误:
! String contains an invalid utf-8 sequence.
l.1 Mo
en dostop za invalide, prepoved kajenja.
l.39 Opombe: & \luadirect{skupina_opombe(arg[3])}
这很奇怪,因为我的源文件 predracun.lua 和 predracun.tex 都是 UTF-8 编码的:
这是 predracun.tex 源文件:
\documentclass[12pt]{article}
% package for UTF-8 encoding
\usepackage[utf8]{luainputenc}
% package for lua
\usepackage{luacode}
\directlua{dofile('predracun.lua')}
\begin{document}
\begin{tabular}{rp{11cm}}
ŽžĐđŠšĆćČč\\
\luadirect{skupina_opombe()}\\
\end{tabular}
\end{document}
这是 predracun.lua 源文件:
function skupina_opombe ()
package.cpath = package.cpath .. ";/usr/lib/x86_64-linux-gnu/lua/5.3/luasql/mysql.so"
luasql = require('luasql.mysql')
env = assert (luasql.mysql())
con = assert (env:connect("linux_krozki","ziga","Slovenija123"))
cur = assert (con:execute("SELECT opombe FROM skupine WHERE id_skupine = (SELECT id_skupine FROM predracuni WHERE id_interesa =1);"))
vnos = cur:fetch ({}, "a")
tex.print(
string.format([[%s]], vnos.opombe)
)
end
我还明确指定了 \usepackage[utf8]{luainputenc} 在 predracun.tex 中。那么为什么我仍然会收到错误?请注意,错误不是由特殊字符 ŽžĐđŠšĆćČč 触发的,而是由从数据库中读取的 \luadirect{skupina_opombe()} 触发的...
PS: 我不确定是否应该将此主题发布在 TeX 社区,因为它是 TeX 和编程语言 Lua 的混合。
对于所有欧洲字符集,utf8和utf8mb4是“相同的”。这两个字符集在一些中文字符和一些表情符号(加上一些晦涩的字符)方面存在差异。
虽然在连接后立即执行con:execute("SET NAMES 'utf8';")是有效的,但最好在连接期间指定客户端的编码。(对不起,我不知道如何在LUA中实现这一点。)
你提到的链接仅解释了如果你想让一堆便便看起来像``而不是被屏蔽为“????”,你必须使用字符集utf8mb4而不是utf8。
尽管你提到的东欧字符在utf8或utf8mb4中都能很好地工作,但我建议使用utf8mb4。
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?


在研究了 MySQL 的在线文档 之后,我发现在 MySQL 的世界里,仅仅让你的数据库和调用数据库的程序使用 UTF-8 编码是不够的!
我们还需要在每次访问数据库时指定 UTF-8 编码!
这对我来说是个大惊喜,而我成功地通过在
predracun.lua中添加一行代码解决了问题,这一行代码救了我一天的时间:cur = assert (con:execute("SET NAMES 'utf8';"))实际上,这告诉 MySQL 服务器从这一点开始连接应该完全以 UTF-8 编码进行操作。因此,这一行代码必须位于从数据库读取数据的代码前面:
cur = assert (con:execute("SELECT opombe FROM skupine WHERE id_skupine = (SELECT id_skupine FROM predracuni WHERE id_interesa =1);"))唯一仍然存在的问题是: