【问题标题】:Why am I getting gibberish characters?为什么我得到乱码字符?
【发布时间】:2012-04-20 15:03:04
【问题描述】:

我正在制作一个 PHP 脚本来反转 HTML 文档中的文本,以处理转换错误的希伯来语 PDF。 (叹气:))

一切正常,但是脚本有一个非常奇怪的输出。只有一些字符,而不是保留希伯来字母,变成空白字符(那些带有问号的黑色菱形)。

我尝试了一些我可以在 SO 及其他地方找到的解决方案,但没有任何改变。或许你能启发我?

您可以在此处查看正在运行的脚本:pilau.phpnet.us/html_invert.php,这是完整的源代码:

<!DOCTYPE html>
<html lang="he-IL">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <form action="html_invert.php" method="post" enctype="application/x-www-form-urlencoded">
        <textarea id="html_code" name="html_code" rows="30" cols="80"><?php
            if (isset($_POST['html_code']))
            {
                function invert_string ($str) {
                        $new_str = '';
                        $i = strlen($str);
                        while ($i > 0) {
                            $new_str .= substr($str, --$i, 1);
                        }
                        return '>'.$new_str.'<';
                    }

                    echo htmlspecialchars(preg_replace('/>(\s*.*\s*)</imUue', 'invert_string("$1")', stripslashes($_POST['html_code'])));
            }
            else { echo 'paste your text here'; }
        ?></textarea>
        <br />
        <input type="submit" value="Process HTML" />
    </form>
</body>
</html>

【问题讨论】:

  • 您需要 mb_substrmb_strlen 以实现多字节安全。
  • 另外,我不认为 stripslashes 是 UTF 安全的。
  • 我没有从链接中得到任何输出..
  • 您是否要直接从 PDF 转换文本?如果是这样,那是你的问题。 PDF 内部不是原始形式的可读文本,您必须对其使用解析器,对它的支持有限。
  • @Wooble:@Matthew:谢谢!我使用了mb_substr('UTF-8')mb_strlen('UTF-8'),并用这个正则表达式替换了stripslashes()preg_replace(array('/\x5C(?!\x5C)/u', '/\x5C\x5C/u'), array('','\\'), $_POST['html_code']),它现在可以工作了,检查一下我们的 :) @showerhead:当然不是,我让谷歌将它转换为 HTML对我来说——我能找到的最好的免费方法。但随后它反转了所有文本。 @RyanS:对不起,伙计,我真的不知道为什么-它对我有用。不管怎么说,还是要谢谢你。如何将此问题标记为已回答?

标签: php unicode substr strlen stripslashes


【解决方案1】:

我猜这个字符集似乎有问题。

在 php.ini 中查找 default_charset,这可能设置为 iso-8859-1。

编辑:现在我想起来了,您也可以尝试发送此标头:

header('Content-Type: text/html; charset=utf-8'); 

【讨论】:

  • 他已经在 HTML 中有那个标题。通过 PHP 发送它有什么不同?
【解决方案2】:

我想将此问题标记为已回答,因此这是由 Wooble 和 Matthew 提供的解决方案,如上述问题的 cmets 所述:

我使用了mb_substr('UTF-8')mb_strlen('UTF-8'),并将stripslashes() 替换为这个正则表达式:preg_replace(array('/\x5C(?!\x5C)/u', '/\x5C\x5C/u'), array('','\\'), $_POST['html_code'])

因此完整的代码如下:

    <textarea id="html_code" name="html_code" rows="30" cols="80"><?php
        if (isset($_POST['html_code']))
        {
            function add_delimiters ($str, $deli, $optional_suffix) {
                return (isset($optional_suffix) ? $deli.$str.$optional_suffix : $deli.$str.$deli);
            }

            function reverse_string ($str) {
                $new_str = '';
                $i = mb_strlen($str, 'UTF-8');
                while ($i > 0) {
                    $new_str .= mb_substr($str, --$i, 1, 'UTF-8');
                }
                return $new_str;
            }

            function utf_stripslashes ($str) {
                return preg_replace(array('/\x5C(?!\x5C)/u', '/\x5C\x5C/u'), array('','\\'), $str);
            }

            function strip_blank_lines ($str) {
                return preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/u", "\n", $str);
            }

            function reverse_html_content ($html) {
                return preg_replace('/>(\s*.*\s*)</imUue', 'add_delimiters(reverse_string("$1"), ">", "<")', utf_stripslashes($html));
            }

            function clear_unsupported_css ($style) {
                return preg_replace(array('/top:\s{0,1}([0-9]*(?!px));{0,1}/iu', '/left:\s{0,1}([0-9]*(?!px));{0,1}/iu'), array('top:$1px;', 'left:$1px;'), $style);
            }

            function process_inline_style ($html, $func) {
                return preg_replace('/style="[a-zA-Z0-9:;\s{0,1}]*"/imUue', $func.'("$0")', $html);
            }               

            echo strip_blank_lines(htmlspecialchars(process_inline_style(reverse_html_content($_POST['html_code']), 'clear_unsupported_css')));
        }
        else { echo 'paste your text here'; }
    ?></textarea>

【讨论】:

    猜你喜欢
    • 2013-07-06
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    相关资源
    最近更新 更多