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.luapredracun.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 的混合。

点赞
用户689242
用户689242

在研究了 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);"))

唯一仍然存在的问题是:

数据库编码utf8utf8mb4是否兼容,或者我应该将我的数据库改成utf8而不是utf8mb4?那篇文章建议我不要... 所以我可能会使用 SET NAMES 'utf8mb4

2017-12-25 09:25:50
用户1766831
用户1766831

对于所有欧洲字符集,utf8和utf8mb4是“相同的”。这两个字符集在一些中文字符和一些表情符号(加上一些晦涩的字符)方面存在差异。

虽然在连接后立即执行con:execute("SET NAMES 'utf8';")是有效的,但最好在连接期间指定客户端的编码。(对不起,我不知道如何在LUA中实现这一点。)

你提到的链接仅解释了如果你想让一堆便便看起来像``而不是被屏蔽为“????”,你必须使用字符集utf8mb4而不是utf8

尽管你提到的东欧字符在utf8或utf8mb4中都能很好地工作,但我建议使用utf8mb4。

2017-12-25 17:22:08