LuaLaTeX - 字符串包含无效的utf-8序列

问题描述 投票:2回答:2

我在Linux Debian上,我试图通过从我的数据库linux_krozki中提取一些信息来打印PDF。为此,我首先创建了我的数据库,其中包含utf8mb4字符集和utf8mb4_slovenian_ci整理。

我没有使用基于utf8utf8_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

enter image description here

当我想使用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的混合体。

mysql encoding utf-8 lua latex
2个回答
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);"))

唯一仍然存在的问题是:

是数据库编码utf8utf8mb4兼容还是我应该使我的数据库utf8不受utf8mb4的影响?那篇文章建议我不要......所以我可能宁愿使用SET NAMES 'utf8mb4


2
投票

对于所有欧洲字符集,utf8和utf8mb4是“相同的”。这两个CHARACTER SETS对于一些汉字和一些表情符号(加上一些不起眼的字符)有所不同。

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

你提到的链接只是解释说,如果你想要一堆poo看起来像💩而不是被????审查,你必须使用CHARACTER SET utf8mb4,而不是utf8

虽然你提到的东欧角色在utf8或utf8mb4中同样有效,但我推荐使用utf8mb4。

© www.soinside.com 2019 - 2024. All rights reserved.