/[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.17 - (hide annotations)
Sun Apr 27 04:32:05 2025 UTC (10 months, 2 weeks ago) by sysadm
Branch: MAIN
Changes since 1.16: +2 -2 lines
Trim trailing whitespaces

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

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