PHP 字符串汉字英文根据字符宽度换行

2019-04-30 14:48  188人阅读  评论 (0)
Tags: php

PHP 字符串汉字英文根据字符宽度换行

在输出字符串的时候需要文字根据宽度换行, 在网页上文字可以根据宽度自动换行, 但是在命令行自定义宽度, 或者其它特殊场景, 就需要自己来控制换行了, 这里假设一个汉字占用2个英文的宽度, 实现了如下代码.

代码

<?php
/**
 * $str 原始字符串
 * $length 插入的间隔长度, 英文长度
 * $hans_length 一个汉字等于多少个英文的宽度, 不支持小数
 * $append 需要插入的字符串
 */
function str_wrap1($str, $length = 16, $hans_length = 2, $append = "\r\n") {
    $nstr = "";
    for ($line = 0, $blen = 1, $len = strlen($str), 
            $i = 0; $i < $len; $i += $blen) {
        $b = unpack("C", $str{$i})[1];
        if (($b & 0xF0) == 0xF0) {
            $blen = 4;
        } elseif (($b & 0xE0) == 0xE0) {
            $blen = 3;
        } elseif (($b & 0xC0) == 0xC0) {
            $blen = 2;
        } else {
            $blen = 1;
        }
        $vlen = $blen > 1 ? $hans_length : 1;
        if ($line + $vlen > $length) { // 检测如果加上当前字符是否会超出行的最大字数
            $nstr .= $append; // 超出就加上换行符
            $line = 0; // 因为加了换行符 就是新的一行 所以当前行长度设置为0
        }
        $nstr .= substr($str, $i, $blen); // 加上当前字符
        $line += $vlen; // 加上当前字符的长度
    }
    return $nstr;
}


/**
 * $str 原始字符串
 * $length 插入的间隔长度, 英文长度
 * $hans_length 一个汉字等于多少个英文的宽度
 * $append 需要插入的字符串
 */
function str_wrap2($str, $length = 16, $hans_length = 2, $append = "\r\n") {
    // $line 记录当前行的长度 // $len utf-8字符串的长度
    $nstr = ""; 
    for ($line = 0, $len = mb_strlen($str, "utf-8"), $i = 0; $i < $len; $i++) {
        $v = mb_substr($str, $i, 1, "utf-8"); // 获取当前的汉字或字母
        $vlen = strlen($v) > 1 ? $hans_length : 1; // 根据二进制长度 判断出当前是中文还是英文
        if ($line + $vlen > $length) { // 检测如果加上当前字符是否会超出行的最大字数
            $nstr .= $append; // 超出就加上换行符
            $line = 0; // 因为加了换行符 就是新的一行 所以当前行长度设置为0
        }
        $nstr .= $v; // 加上当前字符
        $line += $vlen; // 加上当前字符的长度
    }
    return $nstr;
}

$a = "测试商品(1个馍馍+木耳肉片+白菜腐竹+蒸茼蒿+桑菊枸杞茶)";
echo str_wrap1($a), "\n";
echo str_wrap2($a), "\n";

执行结果

测试商品(1个馍馍
+木耳肉片+白菜腐
竹+蒸茼蒿+桑菊枸
杞茶)
测试商品(1个馍馍
+木耳肉片+白菜腐
竹+蒸茼蒿+桑菊枸
杞茶)