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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.20 - (hide annotations)
Wed Jul 2 02:00:57 2025 UTC (8 months, 2 weeks ago) by sysadm
Branch: MAIN
Changes since 1.19: +8 -10 lines
Refine handling of UTF8 character

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

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