LuaLaTeX - 字符串包含无效的utf-8序列
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LuaLaTeX - 字符串包含无效的utf-8序列相关的知识,希望对你有一定的参考价值。
我在Linux Debian上,我试图通过从我的数据库linux_krozki
中提取一些信息来打印PDF。为此,我首先创建了我的数据库,其中包含utf8mb4
字符集和utf8mb4_slovenian_ci
整理。
我没有使用基于utf8
的utf8_slovenian_ci
字符集和this topic。
MariaDB [(none)]> SHOW CREATE DATABASE linux_krozki;
+--------------+-------------------------------------------------------------------------------------------------------+
| Database | Create Database |
+--------------+-------------------------------------------------------------------------------------------------------+
| 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')}
egin{document}
egin{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的混合体。
在研究了MySQL online documentation之后,我发现在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);"))
唯一仍然存在的问题是:
是数据库编码
utf8
和utf8mb4
兼容还是我应该使我的数据库utf8
不受utf8mb4
的影响?那篇文章建议我不要......所以我可能宁愿使用SET NAMES 'utf8mb4
。
对于所有欧洲字符集,utf8和utf8mb4是“相同的”。这两个CHARACTER SETS
对于一些汉字和一些表情符号(加上一些不起眼的字符)有所不同。
虽然在连接后立即执行con:execute("SET NAMES 'utf8';")
是有效的,但最好在连接期间指定客户端的编码。 (抱歉,我不知道如何在LUA中这样做。)
你提到的链接只是解释说,如果你想要一堆poo看起来像 以上是关于LuaLaTeX - 字符串包含无效的utf-8序列的主要内容,如果未能解决你的问题,请参考以下文章