/[LeafOK_CVS]/fenglin/lib/str_process.inc.php
ViewVC logotype

Contents of /fenglin/lib/str_process.inc.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.12 - (show annotations)
Wed Mar 26 07:09:08 2025 UTC (11 months, 3 weeks ago) by sysadm
Branch: MAIN
Changes since 1.11: +44 -1 lines
Add str_length() to calculate the length of string containing UTF-8 based CJK characters

1 <?
2 function str_length($str)
3 {
4 $len = strlen($str);
5 $ret = 0;
6
7 for ($i = 0; $i < $len; $i++)
8 {
9 $c = $str[$i];
10
11 // Process UTF-8 Chinese characters
12 $v1 = ord($c);
13 if (($v1 & 0b10000000) == 0b10000000) //head of multi-byte character
14 {
15 $v2 = ($v1 & 0b01111000) << 1;
16 while ($v2 & 0b10000000)
17 {
18 $i++;
19 $v3 = $str[$i];
20 $c .= $v3;
21 $v2 = ($v2 & 0b01111111 ) << 1;
22 }
23
24 $ret += 2;
25 }
26 else
27 {
28 $ret++;
29 }
30 }
31
32 return $ret;
33 }
34
35 function split_line($str, $prefix = "", $width = 76, $lines_limit = PHP_INT_MAX)
36 {
37 if ($width <= 0)
38 return $str;
39
40 $result = "";
41 $len = strlen($str);
42 $prefix_len = str_length($prefix);
43
44 $lines_count = 0;
45
46 $line = $prefix;
47 $line_len = $prefix_len;
48 for ($i = 0; $i < $len && $lines_count < $lines_limit; $i++)
49 {
50 $c = $str[$i];
51
52 // Skip special characters
53 if ($c == "\r" || $c == "\7")
54 {
55 continue;
56 }
57
58 if ($c == "\n")
59 {
60 $result .= ($line . "\n");
61 $lines_count++;
62 $line = $prefix;
63 $line_len = $prefix_len;
64 continue;
65 }
66
67 // Process UTF-8 Chinese characters
68 $v1 = ord($c);
69 if (($v1 & 0b10000000) == 0b10000000) //head of multi-byte character
70 {
71 $v2 = ($v1 & 0b01111000) << 1;
72 while ($v2 & 0b10000000)
73 {
74 $i++;
75 $v3 = $str[$i];
76 $c .= $v3;
77 $v2 = ($v2 & 0b01111111 ) << 1;
78 }
79
80 // Each UTF-8 CJK character should use two character length for display
81 if ($line_len + 2 > $width)
82 {
83 if ($lines_count + 1 >= $lines_limit)
84 {
85 break;
86 }
87
88 $result .= ($line . "\n");
89 $lines_count++;
90 $line = $prefix;
91 $line_len = $prefix_len;
92 }
93 $line_len += 2;
94 }
95 else
96 {
97 $line_len++;
98 }
99
100 $line .= $c;
101
102 if ($line_len >= $width)
103 {
104 if ($lines_count + 1 >= $lines_limit)
105 {
106 break;
107 }
108
109 $result .= ($line . "\n");
110 $lines_count++;
111 $line = $prefix;
112 $line_len = $prefix_len;
113 }
114 }
115
116 if ($lines_count < $lines_limit)
117 {
118 $result .= $line;
119 }
120
121 return $result;
122 }
123 ?>

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1