PHP 字符串汉字英文根据字符宽度换行
在输出字符串的时候需要文字根据宽度换行, 在网页上文字可以根据宽度自动换行, 但是在命令行自定义宽度, 或者其它特殊场景, 就需要自己来控制换行了, 这里假设一个汉字占用2个英文的宽度, 实现了如下代码.
代码
/**
* $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个馍馍
+木耳肉片+白菜腐
竹+蒸茼蒿+桑菊枸
杞茶)