前言

网上流传着这么一个腾讯笔试题:

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

当然了,编程是一门艺术。同一个功能有多种多样的实现方法。假设您有什么别的办法,能够尽情评论不吝赐教,假设读者认为该方法有什么不妥之后,也可随时指正。

最新文章

  1. Android入门(十一)SQLite CURD
  2. System.exit(0)和System.exit(1)区别
  3. boundingRectWithSize
  4. android Camera 如何判断当前使用的摄像头是前置还是后置
  5. OpenGL、Open Inventor、WebGL、Three.js、ARToolkit、JSARToolkit
  6. 二模09day2解题报告
  7. [课程相关]homework-09
  8. JNI 技术与 Android 应用
  9. java Junit 测试中异常处理
  10. XCode Could not launch &amp;quot;&amp;quot; failed to get the task for process
  11. ubuntu 安装LNMP
  12. jenkin如何实现web版本控制&amp;回退
  13. 2018/12/20 20:52:42 螺纹钢PTA豆粕
  14. tomcat7 内存溢出 java.lang.OutOfMemoryError 处理方法
  15. JMeter执行压测输出HTML图形化报表(二)
  16. 【Java】【图形】
  17. 「SDOI2008」Sandy 的卡片
  18. STM32f103C8T6 Bootloader设计(转)
  19. SPSS-两变量相关性分析
  20. iOS获取网络类型的四种方法

热门文章

  1. element-ui一些注意点:
  2. 【2017 Multi-University Training Contest - Team 5】Rikka with Subset
  3. 【Mysql】将Excel表导入至Mysql的当中一张表
  4. Effective C++ 条款43
  5. 6. oracle学习入门系列之六 模式
  6. google 分屏 横屏模式 按home键界面错乱故障分析(二) 分屏的启动过程
  7. Android学习笔记进阶18之画图并保存图片到本地
  8. index action分析
  9. 57.大数据线性处理csdn数据(fread,fwrite) 百万数据秒读数据
  10. Java 批量修改文件后缀