前言
網上流傳著這么一個騰訊筆試題:
PHP的strtolower()和strtoupper()函數在安裝非中文系統的服務器下可能會導致將漢字轉換為亂碼,請寫兩個替代的函數實現兼容Unicode文字的字符串大小寫轉換。
舉個例子,我們直接對中英文混排的字符串處理是會出亂碼的,如:
php > $a = 'abc中華ABC';php > var_dump(strtoupper($a));string(12) "ABC??ō?ABC"php >
The decimal set: 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W 88 X 89 Y 90 Z 91 [ 92 93 ] 94 ^ 95 _ 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del由 ascii 表我們看出英文小寫字母的ascii 值在 97 ~ 122 之間,由此可得出我們的程序:
<?phpfunction mystrtoupper($a){ $b = str_split($a, 1); $r = ''; foreach($b as $v){ $v = ord($v); if($v >= 97 && $v<= 122){ $v -= 32; } $r .= chr($v); } return $r;}$a = 'a中你繼續F@#$%^&*(BMDJFDoalsdkfjasl';echo 'origin string:'.$a."";echo 'result string:';$r = mystrtoupper($a);var_dump($r);輸出結果 :
origin string:a中你繼續F@#$%^&*(BMDJFDoalsdkfjasl
result string:string(39) "A中你繼續F@#$%^&*(BMDJFDOALSDKFJASL"大寫轉小寫同理可得,不再贅述,完整兩個方法的代碼及使用,可下載:http://download.csdn.net/detail/agangdi/8171599
當然了,編程是一門藝術,同一個功能有多種多樣的實現方法,如果您有什么別的辦法,可以盡情評論指教,如果讀者覺得該方法有什么不妥之后,也可隨時指正。
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答