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

前言

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

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  <    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中你继续[email protected]#$%^&*(BMDJFDoalsdkfjasl';
echo 'origin string:'.$a."\n";
echo 'result string:';
$r = mystrtoupper($a);
var_dump($r);

输出结果 :

origin string:a中你继续[email protected]#$%^&*(BMDJFDoalsdkfjasl
result string:string(39) "A中你继续[email protected]#$%^&*(BMDJFDOALSDKFJASL"

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

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

时间: 2024-12-13 09:17:03

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

boost 字符串大小写转换

示例代码如下: 1 #include <boost/algorithm/algorithm.hpp> 2 #include <iostream> 3 using namespace std; 4 #include <string> 5 6 void TimerTest() 7 { 8 // 字符串大小写转换; 9 string strTemp = "asdQWEghhh"; 10 string strTemp1 = strTemp; 11 strin

python 字符串大小写转换(不能使用swapcase()方法)

python 3字符串大小写转换 要求不能使用swapcase()方法 #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Hiuhung Wan str1 = input("请输入字符串:") list1 = list(str1) str2 = '' for i in list1: if int(ord(i)) >= 65 and int(ord(i)) <= 90: #大写 str2 += chr(int(ord(

Python: 在Unicode和普通字符串之间转换

Unicode字符串可以用多种方式编码为普通字符串, 依照你所选择的编码(encoding): <!-- Inject Script Filtered --> Toggle line numbers 1 #将Unicode转换成普通的Python字符串:"编码(encode)" 2 unicodestring = u"Hello world" 3 utf8string = unicodestring.encode("utf-8") 4

Python——在Unicode和普通字符串之间转换

1.1. 问题 Problem You need to deal with data that doesn't fit in the ASCII character set. 你需要处理不适合用ASCII字符集表示的数据. 1.2. 解决 Solution Unicode strings can be encoded in plain strings in a variety of ways, according to whichever encoding you choose: Unicode

php 字符串大小写转换

strtoupper().strtolower().ucfirst().ucfirst().ucwords().mb_strtoupper().mb_strtolower()和mb_convert_case()这八个函数的区别和联系: 函数名称 使用范围 功能 strtoupper PHP4.PHP5 将字符串转化为大写 strtolower PHP4.PHP5 将字符串转化为小写 ucfirst PHP4.PHP5 将字符串的首字母转化为大写 lcfirst PHP5>= 5.3.0 将字符串

JS字符串大小写转换实现方式

toLocaleUpperCase 方法:将字符转换为大写 stringVar.tolocaleUpperCase( ) 必选的 stringVar 引用是一个 String 对象,值或文字. //转换成大写toUpperCase 方法返回一个字符串,该字符串中的所有字母都被转化为大写字母. strVariable.toUpperCase( )"String Literal".toUpperCase( ) 说明toUpperCase 方法对非字母字符不会产生影响. toLocaleLo

字符串-大小写转换

问题描述:编写一个程序,输入一个字符串(长度不超过20),然后把这个字符串内的每一个字符进行大小写变换,即将大写字母变成小写,小写字母变成大写,然后把这个新的字符串输出.输入格式:输入一个字符串,而且这个字符串当中只包含英文字母,不包含其他类型的字符,也没有空格.输出格式:输出经过转换后的字符串. 输入输出样例:样例输入:AeDb样例输出:aEdB 代码如下: 1 #include <iostream> 2 using namespace std; 3 #include <cstring

Python初学者笔记(3):输出列表中的奇数/奇数项,字符串中的偶数项,字符串大小写转换

[1]a=[8,13,11,6,26,19,24]1)请输出列表a中的奇数项2)请输出列表a中的奇数 解:1) 1 a=[8,13,11,6,26,19,24] 2 print a[::2] Result:>>>[8, 11, 26, 24] 2) 1 a = [8,13,11,6,26,19,24] 2 b = [] 3 for item in a: 4 if item%2 !=0: 5 b.append(item) 6 else: 7 continue 8 print b Resul

strtolower() strtoupper()等字符串大小写转换函数

$str = "Mary Had A Little Lamb and She LOVED It So"; string strtolower ( string $str )— 将字符串转化为小写(所有字符) // 打印 mary had a little lamb and she loved it so 返回值:返回转换后的字符串 string strtoupper ( string $string )— 将字符串转化为大写(所有字符) 打印 MARY HAD A LITTLE LAM