【问题标题】:UTF8 Output Issue Laravel PHPUTF8 输出问题 Laravel PHP
【发布时间】:2018-03-17 12:28:25
【问题描述】:

我与字符和编码从来没有相处过,我想知道是否有人可以帮助解决我正在努力解决的问题。这很可能是编码 101 问题,尽管我搜索了文档、论坛等,但我找不到解决方案。

我的环境:

XAMMP 上的 Laravel 5.5 (Windows)

我的数据库有如下名称: "D\xc3\xacaz de la Pe\xc3\xb1a"

应该输出为“Díaz de la Peña”

根据 UT8 图表,这些字符是正确的: http://www.utf8-chartable.de/unicode-utf8-table.pl?start=128&number=128&names=-&utf8=string-literal

以该格式保存到数据库时是否出错?它们是否应该以其他方式编码?

或者我只是输出不正确。我已经尝试过 utf8_encode 和 utf8_decode 并且我似乎得到的唯一输出是相同的 "D\xc3\xacaz de la Pe\xc3\xb1a"

谢谢

【问题讨论】:

    标签: php utf-8 character-encoding


    【解决方案1】:

    您可以使用preg_replace_callback() 替换\xXX 值,使用hexdec()chr()

    $str = 'D\xc3\xacaz de la Pe\xc3\xb1a' ;
    $str = preg_replace_callback('~\\\\x([a-f0-9]{2})~', function($match) {
        return chr(hexdec($match[1]));
    }, $str);
    echo $str ;
    

    输出:

    "Dìaz de la Peña"
    

    上面的代码采用与\x 匹配的所有字符串,后跟2 个十六进制字符。然后,它们使用hexdec() 转换为十进制值,最后使用chr() 转换为字符。

    您也可以将[a-f0-9] 替换为[[:xdigit:]]

    '~\\\\x([[:xdigit:]]{2})~'
    

    这是匹配的demo

    【讨论】:

    • 感谢第一个例子效果很好,我用它做了一个函数。将这些 UTF8 字符存储在那些代码集中的数据库中,我错了吗?你还有其他方法吗?
    • 感谢您的回复。也许您可以直接存储带有编码字符的字符串,而不是每次需要它们时对其进行编码。但我不知道您如何存储它们以及您的数据库是如何配置的。另外,如果答案解决了您的问题,请不要忘记关闭您的问题。谢谢 :) meta.stackexchange.com/questions/5234/…
    猜你喜欢
    • 2015-11-23
    • 1970-01-01
    • 2020-03-10
    • 2014-02-04
    • 2012-07-09
    • 1970-01-01
    • 2016-08-31
    • 2013-06-17
    • 1970-01-01
    相关资源
    最近更新 更多