/[LeafOK_CVS]/lbbs/utils/lib/str_process.inc.php
ViewVC logotype

Contents of /lbbs/utils/lib/str_process.inc.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.3 - (show annotations)
Wed Jul 2 04:17:33 2025 UTC (8 months, 2 weeks ago) by sysadm
Branch: MAIN
Changes since 1.2: +19 -9 lines
Support UTF8 instead of GBK

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

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