【问题标题】:LuaLaTeX - string contains an invalid utf-8 sequenceLuaLaTeX - 字符串包含无效的 utf-8 序列
【发布时间】:2018-06-04 22:52:06
【问题描述】:

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

我没有使用utf8 字符集和基于this topicutf8_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.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 

我还在predracun.tex 中明确指定了\usepackage[utf8]{luainputenc}。那么为什么我仍然得到错误?请注意,错误不是由特殊字符 ŽžĐđŠšĆćČč 触发的,而是由从数据库中读取的 \luadirect{skupina_opombe()} 触发的......

PS:我不确定是否应该在 TeX 社区上发布这个主题,因为它是 TeX 和编程语言 Lua 的混合体。

【问题讨论】:

  • 如果我用ŽšŠ替换字母ž,症状是一样的,但是如果我用ĐđĆ替换它, ć,PDF 将被编译,但这些字母将在 PDF 中显示为 ?
  • 我想我可能会错过这个:dev.mysql.com/doc/refman/5.7/en/charset-connection.html 但我不确定如何在我的 Lua 文件中实现它。
  • 获取字符串的十六进制,如果ž变成9E,则字符在latin1/cp1250。如果你得到C5BE,那么你就有utf8/utf8mb4。
  • 这可以使用像 Okteta 或 Bless 的十六进制编辑器来检查!好主意!

标签: mysql encoding utf-8 lua latex


【解决方案1】:

在研究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

【讨论】:

  • 看来必须使用utf8mb4,因为utf8是有限字符集,无法容纳U+FFFF以上的unicode字符
  • @EgorSkriptunoff - ŽžĐđŠšĆćČč 在 utf8 和 utf8mb4 中都可用。 (但我同意;尽可能使用 utf8mb4。)
【解决方案2】:

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

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

您提到的链接只是说明,如果您希望一堆便便看起来像 ? 并且不被审查为 ????,则必须使用 CHARACTER SET utf8mb4,而不是 utf8

虽然您提到的东欧字符在 utf8 或 utf8mb4 中同样适用,但我建议使用 utf8mb4。

【讨论】:

    猜你喜欢
    • 2020-03-07
    • 2023-03-23
    • 2019-09-21
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 2013-12-22
    相关资源
    最近更新 更多