代码之家  ›  专栏  ›  技术社区  ›  Michael Mao

为什么我的排字功能不适用于非拉丁/亚洲字符?

  •  0
  • Michael Mao  · 技术社区  · 15 年前

    我已经说服我的老板使用PHP(PHP版本5.2.8)进行排版。 这就是我到目前为止所得到的(如果您看到错误的日文字符,请将字符编码设置为Unicode(UTF-8)):

    demo page at my personal website

    基本上,如果您将拉丁示例段落复制并粘贴到文本区域,然后单击按钮,一切都会正常工作,您可以通过将结果粘贴到记事本中进行检查来验证(尽管事实上,我没有使用连字符来表示新行分隔的单词)。

    但是,当它带有非拉丁/亚洲字符时,没有打印出来。我没有收到任何生成的错误消息,只是根本看不到任何内容…

    以下是我的代码:

    <?php
    $words = typesetWords($_POST['words']);
    echo json_encode(array('feedback' => $words));
    
    function typesetWords($words, $lineLength = 70)
    {
        try
        {
            $result = '';
            $paragraphs = explode("\n\n", $words);
            foreach($paragraphs as $paragraph)
            {
                $paragraph = str_replace("\n", "", $paragraph);
                $length = strlen($paragraph);
                $numberOfLines = intval($length / $lineLength);
                $tmp = '';
                if($numberOfLines > 0)
                {
                    for($i = 0; $i < $numberOfLines; $i++)
                        $tmp .= substr($paragraph, $i * $lineLength, $lineLength)."\n";
                    $tmp .= substr($paragraph, -1 * ($length % $lineLength))."\n\n";
                    $result .= $tmp;
                }
                else $result .= $paragraph."\n\n";
            }
        }
        catch(Exception $e)
        {
            return $e->getMessage();
        }
        return $result;
    }
    

    ?gt;

    我试着把表格直接寄回来的东西退回去,我确实毫无问题地看到了日文示例段落。因此,我认为其中一个PHP库函数必须 导致了这个错误,但我不知道是哪个错误以及如何修复它…

    非常感谢!

    1 回复  |  直到 12 年前
        1
  •  0
  •   Percutio    15 年前

    strlen() 将返回为ansi/ascii而不是utf-8格式化的字符串中的字符数。尝试 mb_strlen() 相反。