我在Linux Debian上,我试图通过从我的数据库linux_krozki
中提取一些信息来打印PDF。为此,我首先创建了具有utf8mb4
字符集和utf8mb4_slovenian_ci
排序规则的数据库。
我没有使用基于this topic的utf8
字符集和utf8_slovenian_ci
。
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')}
\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的混合体。
答案 0 :(得分:3)
在研究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
。
答案 1 :(得分:2)
对于所有欧洲字符集,utf8和utf8mb4是“相同的”。这两个CHARACTER SETS
对于一些汉字和一些表情符号(加上一些模糊的字符)有所不同。
连接后立即执行con:execute("SET NAMES 'utf8';")
有效,最好在连接期间指定客户端的编码。 (对不起,我不知道如何在LUA中这样做。)
你提到的链接只是解释了如果你想要一堆poo看起来像而不被审查到
????
,你必须使用CHARACTER SET utf8mb4
,而不是{{ 1}}。
虽然你提到的东欧角色在utf8或utf8mb4中同样有效,但我推荐使用utf8mb4。