代码之家  ›  专栏  ›  技术社区  ›  71GA

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

  •  2
  • 71GA  · 技术社区  · 7 年前

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

    我没有使用 utf8 字符集和 utf8_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.lua predracun.tex 都是UTF-8编码的:

    这里是 predracun。特克斯 源文件:

    \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。卢阿 源文件:

    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。特克斯 . 那么为什么我仍然会出错呢?请注意,特殊字符不会触发错误 ŽžĐđŠšĆćČč 但是 \luadirect{skupina_opombe()} 从数据库中读取。。。

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

    2 回复  |  直到 7 年前
        1
  •  3
  •   71GA    7 年前

    学习后 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 .

        2
  •  2
  •   Rick James diyism    7 年前

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

    鉴于正在进行 con:execute("SET NAMES 'utf8';") 在连接有效后,最好在连接期间指定客户端的编码。(对不起,我不知道在LUA怎么做。)

    你提到的链接只是解释了如果你想让一堆便便看起来像 💩 不受审查 ???? ,您必须使用 CHARACTER SET utf8mb4 utf8 .

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