调试 iconv_strlen 错误 - PHP 5.5

10

我正在尝试使用 Laravel 和 DomPDF 将文档导出为 PDF。这在我的 Mac 上可以工作,但在暂存或生产服务器上无法工作。错误如下:

我不知道这是什么意思,也找不到任何解决方案。

iconv_strlen():错误的字符集,从 8bit//IGNORE' 转换到 UCS-4LE' 不被允许

<code>open: /srv/www/html/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/Mbstring.php

        return true;
    }

    static function mb_strlen($s, $encoding = INF)
    {
        INF === $encoding && $encoding = self::$internal_encoding;
        return iconv_strlen($s, $encoding . '//IGNORE');
    }
</code>

我尝试将以下内容添加到.htaccess文件中

<code>AddDefaultCharset UTF-8
</code>

我尝试在我正在为其生成PDF的视图顶部添加以下内容:

<code><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</code>

如果您需要任何进一步的信息来帮助我进行调试,请在评论中提问。


3
似乎问题出在Patchwork提供的MBString兼容性层上。也就是说,您的服务器未启用MBString,并且该兼容层中的某些内容不像预期那样工作。知道调用mb_strlen函数的是什么会有所帮助。您能获取一个堆栈跟踪吗? - BrianS
1
问题已解决。感谢BrianS的帮助。通过重新安装mbstring解决了问题。sudo yum --disablerepo="*" --enablerepo="remi*" install php-mbstring* sudo httpd -k restart - Gravy
1
你应该通过回答自己的问题来提供一个解决方案。你能否解释一下如何运行这个过程? - Shane
@Gravy 我也遇到了同样的问题,更新php-mbstring解决了它。你应该在你的问题下发布一个答案,说明你是如何解决的! - msturdy
5个回答

9
问题已解决。感谢BrianS。重新安装mbstring即可解决此问题。
sudo yum --disablerepo="*" --enablerepo="remi*"
install php-mbstring*
sudo httpd -k restart

4
BrianS的解决方案确实解决了问题,但我认为解释一下原始问题的原因会更有趣。
在dompdf的最新版本中,Cpdf类包含大约30个调用mb_strlen()的语句,其中$encoding参数设置为'8bit',这是mb_strlen()有效编码之一。
Laravel的composer.json需要patchwork/utf8,它提供了mb_strlen()的替代方法,该方法调用iconv_strlen()
PHP通常使用glibclibiconv作为其iconv模块。对于这两个库,支持的编码列表可以使用iconv --list命令显示
这两个库都不支持名为'8bit'的编码,这就是为什么iconv_strlen()会抛出该错误的原因。
Wrong charset, conversion from '8bit//IGNORE' to 'UCS-4LE' is not allowed

安装mbstring PHP模块会使mb_strlen()原生执行,因此不使用shim,也不会出现错误。

更新

@rofavadeka的一个解决方案是创建dompdf repo的fork,并将每个使用'8bit'编码的地方替换为另一种被mb_strlen()glibclibiconv支持的8位编码。

我编写了一个脚本来确定哪些编码适合使用。下面是对glibclibiconv的输出。适合的编码为:

  • cp850 - CP850是一种字符编码,用于在计算机上表示拉丁字母表中的字符集。
  • cp866 - CP866是一种字符编码,用于在计算机上表示西里尔字母表中的字符集。
  • iso-8859-1 - ISO-8859-1是一种字符编码,也称为Latin-1,它包含了欧洲大多数语言所需的字符。
  • iso-8859-2 - ISO-8859-2是一种字符编码,包含了中欧和东欧语言所需的字符。
  • iso-8859-4 - ISO-8859-4是一种字符编码,包含了波罗的海语言所需的字符。
  • iso-8859-5 - ISO-8859-5是一种字符编码,包含了西里尔字母表中的字符集。
  • iso-8859-9 - ISO-8859-9是一种字符编码,也称为Latin-5,包含了土耳其语所需的字符。
  • iso-8859-10 - ISO-8859-10是一种字符编码,也称为Latin-6,包含了北欧语言所需的字符。
  • iso-8859-13 - ISO-8859-13是一种字符编码,包含了波罗的海语言所需的字符。
  • iso-8859-14 - ISO-8859-14是一种字符编码,也称为Latin-8,包含了凯尔特语言和布列塔尼语所需的字符。
  • iso-8859-15 - ISO-8859-15是一种字符编码,也称为Latin-9,它是ISO-8859-1的修订版,增加了一些欧洲语言所需的字符。
  • iso-8859-16 - ISO-8859-16是一种字符编码,包含了东南欧语言所需的字符。
  • koi8-r - KOI8-R是一种字符编码,用于在计算机上表示俄语字符集。
  • koi8-u - KOI8-U是一种字符编码,用于在计算机上表示乌克兰语字符集。

那么有没有办法更改“8bit”编码或解决这个问题?我也遇到了同样的问题,但是由于使用的是共享托管,所以不能简单地重新安装来解决问题!希望你能指导我正确的方向。 - rofavadeka

3

在进行测试数据库种子时,Hash:make() 函数报错。

这是由于启用了 php-cli.ini 中的 php_mbstring 所致。

在 Windows 中的解决方法是:删除分号,即

 extension=php_mbstring.dll

1
你的意思是在 php.ini 文件中吗? - philipxy

0

如果您使用的是wamp或某些自定义堆栈,请记住您中的php可能正在使用自定义的php_something.ini用于apache使用,因此即使 GUI显示mbstring已经启用(取消注释),仍然有可能在实际的php.ini文件中该行被注释掉(禁用/关闭)(真实故事)。

解决方案: 只需导航到

wamp dir > bin > php > phpx.x.x >

在这个目录中,您会找到各种名称略有不同的.ini文件,我的堆栈使用php_uwamp.ini,但对于CLIphp使用相邻的名为php.ini的文件。
这让我苦思冥想了很长时间,希望能帮助到其他人。

0
如果您正在使用 WHM,则可以使用 EasyApache 进行重建。 选择 PHP 版本后,获取模块选项,然后选择“详尽选项列表”按钮。 然后按 Ctrl + F 查找“mbstring”,它应该出现。 选中复选框并进行重建。 它应该可以工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接