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中你继续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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,以下是使用 Java 编写一个程序,实现字符串大小写转换和倒序输出的代码: ```java import java.util.Scanner; public class StringConversion { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("请输入字符串:"); String str = input.nextLine(); // 将字符串转换为小写并输出 String strToLower = str.toLowerCase(); System.out.println("转换为小写后的字符串为:" + strToLower); // 将字符串转换为大写并输出 String strToUpper = str.toUpperCase(); System.out.println("转换为大写后的字符串为:" + strToUpper); // 将字符串倒序输出 String strReverse = new StringBuilder(str).reverse().toString(); System.out.println("倒序输出字符串为:" + strReverse); } } ``` 运行该程序后,输入一个字符串,程序将会将该字符串转换为小写和大写,并输出倒序后的字符串。 希望能够帮助到你! ### 回答2: 以下是用Java编写的程序,实现字符串大小写的转换并倒序输出: ```java import java.util.Scanner; public class StringConversion { public static void main(String[] args) { // 从控制台读取输入的字符串 Scanner scanner = new Scanner(System.in); System.out.print("请输入一个字符串:"); String str = scanner.nextLine(); // 将字符串转换为大写并倒序输出 String convertedStr = convertToUpper(str); String reversedStr = reverseString(convertedStr); // 输出结果 System.out.println("转换后的字符串为:" + reversedStr); } // 将字符串转换为大写 public static String convertToUpper(String str) { return str.toUpperCase(); } // 倒序输出字符串 public static String reverseString(String str) { // 将字符串转换为字符数组 char[] charArray = str.toCharArray(); // 倒序输出字符数组 StringBuilder reversedStr = new StringBuilder(); for (int i = charArray.length - 1; i >= 0; i--) { reversedStr.append(charArray[i]); } return reversedStr.toString(); } } ``` 运行这个程序后,用户需要在控制台输入一个字符串,程序会先将字符串转换为大写,然后将转换后的字符串倒序输出到控制台中。例如,如果输入字符串为"Hello World!",程序会输出"!DLROW OLLEH"。 ### 回答3: 可以使用Java编写以下程序来实现字符串大小写的转换并倒序输出: ```java import java.util.Scanner; public class StringCaseConverter { public static void main(String[] args) { // 获取用户输入的字符串 Scanner scanner = new Scanner(System.in); System.out.print("请输入一个字符串: "); String inputString = scanner.nextLine(); // 字符串大小写转换并倒序输出 String reversedString = reverseStringCase(inputString); System.out.println("转换后的字符串为: " + reversedString); } public static String reverseStringCase(String str) { StringBuilder result = new StringBuilder(); for (int i = str.length() - 1; i >= 0; i--) { char c = str.charAt(i); if (Character.isUpperCase(c)) { result.append(Character.toLowerCase(c)); } else if (Character.isLowerCase(c)) { result.append(Character.toUpperCase(c)); } else { result.append(c); } } return result.toString(); } } ``` 这个程序首先通过`Scanner`类获取用户输入的字符串,然后调用`reverseStringCase`方法将字符串中的字符进行大小写转换并倒序输出。`reverseStringCase`方法使用一个`StringBuilder`对象来保存转换后的字符串。它遍历输入字符串的每个字符,如果字符是大写字母,则将其转换为小写字母;如果字符是小写字母,则将其转换为大写字母;如果字符不是字母,则保持不变。最后,方法返回转换后的字符串。 通过运行以上程序,用户可以输入一个字符串,程序将输出转换后的字符串。例如,如果用户输入"Hello World",程序将输出"DLROw OLLEh"。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值