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

时间:2017-12-22 09:21:04

标签: mysql encoding utf-8 lua latex

我在Linux Debian上,我试图通过从我的数据库linux_krozki中提取一些信息来打印PDF。为此,我首先创建了具有utf8mb4字符集和utf8mb4_slovenian_ci排序规则的数据库。

我没有使用基于this topicutf8字符集和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字母:

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

2 个答案:

答案 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);"))

唯一仍然存在的问题是:

  

数据库编码utf8utf8mb4是否兼容或应该是我   使我的数据库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。