php实现兼容Unicode文字的字符串大写和小写转换strtolower()和strtoupper()
2017-06-13 20:38
471 查看
前言
网上流传着这么一个腾讯笔试题:
PHP的strtolower()和strtoupper()函数在安装非中文系统的server下可能会导致将汉字转换为乱码,请写两个替代的函数实现兼容Unicode文字的字符串大写和小写转换。
举个样例。我们直接对中英文混排的字符串处理是会出乱码的,如:
我们知道中文在 UTF8 编码里是由3个字符组成的,那么换个思路。我们能够把一个中文当成3个字符来处理,同理再换个思路,在一个把小写英文转换成大写英文的函数里。我们要处理的仅仅有小写字母。那么我们就能够对一个字符串逐个字符进行处理。仅仅处理小写字母,那么怎样推断一个字符是小写字母呢,当然是用 ascii 码了,使用 linux 或者 mac os (实际上也为 linux 系统)的朋友能够直接使用命令 man ascii 查看字符 ascii 码相应值:
输出结果 :
大写转小写同理可得,不再赘述,完整两个方法的代码及使用,可下载:http://download.csdn.net/detail/agangdi/8171599
当然了,编程是一门艺术。同一个功能有多种多样的实现方法。假设您有什么别的办法,能够尽情评论不吝赐教,假设读者认为该方法有什么不妥之后,也可随时指正。
网上流传着这么一个腾讯笔试题:
PHP的strtolower()和strtoupper()函数在安装非中文系统的server下可能会导致将汉字转换为乱码,请写两个替代的函数实现兼容Unicode文字的字符串大写和小写转换。
举个样例。我们直接对中英文混排的字符串处理是会出乱码的,如:
php > $a = 'abc中华ABC'; php > var_dump(strtoupper($a)); string(12) "ABCĸ? ō?ABC" php >
我们知道中文在 UTF8 编码里是由3个字符组成的,那么换个思路。我们能够把一个中文当成3个字符来处理,同理再换个思路,在一个把小写英文转换成大写英文的函数里。我们要处理的仅仅有小写字母。那么我们就能够对一个字符串逐个字符进行处理。仅仅处理小写字母,那么怎样推断一个字符是小写字母呢,当然是用 ascii 码了,使用 linux 或者 mac os (实际上也为 linux 系统)的朋友能够直接使用命令 man ascii 查看字符 ascii 码相应值:
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 之间,由此可得出我们的程序:
<?php function 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."\n"; 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
当然了,编程是一门艺术。同一个功能有多种多样的实现方法。假设您有什么别的办法,能够尽情评论不吝赐教,假设读者认为该方法有什么不妥之后,也可随时指正。
相关文章推荐
- PHP的strtolower()和strtoupper()函数在安装非中文系统的服务器下可能会导致将汉字转换为乱码,请写两个替代的函数实现兼容Unicode文字的字符串大小写转换
- php实现兼容Unicode文字的字符串大小写转换strtolower()和strtoupper()
- 小写字符串转换为大写字符串实现
- 用PHP实现小写金额转换大写金额的代码(精确到分)
- php ucwords() 函数将字符串中每个单词的首字符转换为大写(实现代码)
- 用PHP实现小写金额转换大写金额的代码(精确到分)
- php strtoupper 和 array_change_key_case 字符串转大写,小写
- PHP 实现人民币小写转换成大写的方法及大小写转换函数
- PHP实现驼峰样式字符串(首字母大写)转换成下划线样式字符串的方法示例
- php 首字母及"_"后首字母都要大写(实现字符串中"open_door"转换成"OpenDoor")
- php将字符串全部转换成大写或者小写的方法
- php 首字母及"_"后首字母都要大写(实现字符串中"open_door"转换成"OpenDoor")
- php ucwords() 函数将字符串中每个单词的首字符转换为大写(实现代码)
- 用PHP实现小写金额转换大写金额【精确到分】
- PHP实现字符串转换成查询语句
- Oracle实现小写金额转换成大写的方法
- PHP中实现数字金额到中文大写字符的转换
- Oracle函数实现:人民币小写转换为发票大写
- ABAP--将数字金额转换为人民币大写字符串(增加UNICODE版本)
- PHP实现gb2312、UTF-8等字符和unicode间的编码转换及PHP版unescape