> 백엔드 개발 > PHP 튜토리얼 > php实现兼容Unicode文字的字符串大小写转换strtolower()和strtoupper()

php实现兼容Unicode文字的字符串大小写转换strtolower()和strtoupper()

WBOY
풀어 주다: 2016-06-23 13:44:57
원래의
1535명이 탐색했습니다.

前言

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

PHP的strtolower()和strtoupper()函数在安装非中文系统的服务器下可能会导致将汉字转换为乱码,请写两个替代的函数实现兼容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      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  <p></p>  <p><br> </p> 输出结果 :  <p></p>  <pre name="code" class="sycode">origin string:a中你继续F@#$%^&*(BMDJFDoalsdkfjaslresult string:string(39) "A中你继续F@#$%^&*(BMDJFDOALSDKFJASL"
로그인 후 복사


大写转小写同理可得,不再赘述,完整两个方法的代码及使用,可下载:http://download.csdn.net/detail/agangdi/8171599

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



원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿