--- fenglin/lib/str_process.inc.php 2005/03/23 17:31:14 1.7 +++ fenglin/lib/str_process.inc.php 2025/03/18 07:10:59 1.10 @@ -1,75 +1,76 @@ 127) - { - $hz_ok = (!$hz_ok); - } - if (ord($str[$i])<=127) + $c = $str[$i]; + + // Skip special characters + if ($c == "\r" || $c == "\7") { - $hz_ok = true; + continue; } - if ($line_count >= $width && $hz_ok) + + if ($c == "\n") { - $lines[$lines_count++] = $line; + $result .= ($line . "\n"); + $lines_count++; $line = $prefix; - $line_count = strlen($line); + $line_len = $prefix_len; + continue; } - } - $lines[$lines_count++] = $line; - - $result = ""; - for($i=0;$i<$lines_count;$i++) - { - $result.=($lines[$i]."\r\n"); - } - return $result; -} -function str_process($str,$prefix="",$width=75) -{ - $result = ""; - - $lines = explode("\n",str_replace("\r\n","\n",$str)); + // Process UTF-8 Chinese characters + $v1 = ord($c); + if (($v1 & 0b10000000) == 0b10000000) //head of multi-byte character + { + $v2 = ($v1 & 0b01111000) << 1; + while ($v2 & 0b10000000) + { + $i++; + $v3 = $str[$i]; + $c .= $v3; + $v2 = ($v2 & 0b01111111 ) << 1; + } + + // Each UTF-8 CJK character should use two character length for display + if ($line_len + 2 > $width) + { + $result .= ($line . "\n"); + $lines_count++; + $line = $prefix; + $line_len = $prefix_len; + } + $line_len += 2; + } + else + { + $line_len++; + } - foreach($lines as $tmp => $line) - { - $result .= split_line($line,$prefix,$width); - } - - return $result; -} + $line .= $c; -function str_b_lines($str,$max_line=1) -{ - $result = ""; - $l = 0; - $lines = explode("\n",str_replace("\r\n","\n",$str)); - foreach($lines as $tmp => $line) - { - $result .= ($line."\r\n"); - $l += (strlen($line)/256 + 1); - if ($l >= $max_line) - break; + if ($line_len >= $width) + { + $result .= ($line . "\n"); + $lines_count++; + $line = $prefix; + $line_len = $prefix_len; + } } + $result .= ($line . "\n"); return $result; } - ?>