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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LuaLaTeX - 字符串包含无效的utf-8序列相关的知识,希望对你有一定的参考价值。

我在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')}

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

唯一仍然存在的问题是:

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

另一答案

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

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

你提到的链接只是解释说,如果你想要一堆poo看起来像

以上是关于LuaLaTeX - 字符串包含无效的utf-8序列的主要内容,如果未能解决你的问题,请参考以下文章

编码 4 字节 UTF-8 字符 ????从 Rails 到 JSON 产生无效字符

LuaLaTeX 使用笔记

VS调试:字符串中的字符无效

LuaLaTeX的中文支持设置与简单示例

LuaLaTeX的中文支持设置与简单示例

如何识别/删除 R 中的非 UTF-8 字符