这个问题来自腾讯的一道笔试题:
PHP的strtolower()和strtoupper()函数在安装非中文系统的服务器下可能会导致将汉字转换为乱码,请写两个替代的函数实现兼容Unicode文字的字符串大小写转换。

原因是:中文是由多字节组成的,而只有英文系统的单个英文字符只有一个字节,所以该系统把中文的每一个字节都做了strtolower()处理,改变后的中文字节拼接在一起就成了乱码(新生成的编码映射对应的字符可能就不是中文了)

手动解决:用str_split(string $string,int $split_length = 1)按每个字节切割,像中文能切割成三个字节。对识别到的字节若是英文字母则进行转换。

<?php
function mystrtoupper($a){$b = str_split($a, 1);$r = '';foreach($b as $v){$v = ord($v);//对该字符转成acsii码if($v >= 97 && $v<= 122){//判断是否为小写字母$v -= 32;//转换成大写字母}$r .= chr($v);//将ascii码再转为相应的字符。}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"

PHP函数解决:
用mbstring扩展,内部有个函数

string mb_convert_case (string $str ,int $mode [,string $encoding = mb_internal_encoding()])

$mode有三种模式:
1.MB_CASE_UPPER:转成大写
2.MB_CASE_LOWER:转成小写
3.MB_CASE_TITLE :转成首字母大写

$encoding默认使用内部编码;也可以显示使用如’UTF-8’;
可以用echo mb_internal_encoding();来查看;

推荐使用该扩展,不仅对中文适用,对其他语言也适用。


string ucwords ( string $str )将每个单词的首字母大写
string ucfirst ( string $str )只是将字符串的首字母大写而已

<?php
//注意world的区别
$str = "hello world";
var_dump(ucfirst($str));//string(11) "Hello world"
var_dump(ucwords($str));//string(11) "Hello World"
var_dump(mb_convert_case($str,MB_CASE_TITLE,'UTF-8'));//string(11) "Hello World"

strtolower()和strtoupper()中文乱码问题相关推荐

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

    前言 网上流传着这么一个腾讯笔试题: PHP的strtolower()和strtoupper()函数在安装非中文系统的服务器下可能会导致将汉字转换为乱码,请写两个替代的函数实现兼容Unicode文字的 ...

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

    前言 网上流传着这么一个腾讯笔试题: PHP的strtolower()和strtoupper()函数在安装非中文系统的服务器下可能会导致将汉字转换为乱码,请写两个替代的函数实现兼容Unicode文字的 ...

  3. php input 乱码,PHP中文乱码解决方案

    汉字乱码真是一个悲催的事情,JAVA讨厌汉字,PHP也不喜欢汉字: 4)因果图方法:前面介绍的等价类划分方法和边界值分析方法,都是着重考虑输入条件,但未考虑输入条件之间的联系, 相互组合等. 考虑输入 ...

  4. SpringSecurity安全验证中文乱码问题

    使用SpringSecurity做安全验证时发现form表单中提交中文名会出现乱码问题. 原因是因为我在web.xml配置文件中将springSecurityFilterChain拦截器放在了 cha ...

  5. httpclient工具类,post请求发送json字符串参数,中文乱码处理

    在使用httpclient发送post请求的时候,接收端中文乱码问题解决. 正文: 我们都知道,一般情况下使用post请求是不会出现中文乱码的.可是在使用httpclient发送post请求报文含中文 ...

  6. 关于HttpClient上传中文乱码的解决办法

    使用过HttpClient的人都知道可以通过addTextBody方法来添加要上传的文本信息,但是,如果要上传中文的话,或还有中文名称的文件会出现乱码的问题,解决办法其实很简单: 第一步:设置Mult ...

  7. Servlet、MySQL中文乱码

    1.Servlet中文乱码: 在doPost或doGet方法里,加上以下两行即可: response.setContentType("text/html;charset=UTF-8" ...

  8. android java 中文乱码_android读写中文如何避免乱码详解

    前言 android读取文件中文出现乱码的原因无非就是,读取文件的字符格式与写如文件的格式不一致.因此,避免中文乱码,要在写入文件的时候按照一定的格式写入,读取的时候按照一定的格式读取.这样对应就不会 ...

  9. java servlet 参数乱码_JSPServlet处理参数中的中文乱码总结

    从form表单提交信息到一个JSP页面或者一个Servlet进行处理的时候,提交的中文信息若不加处理的话就会显示乱码,如一串???.现在通过一个例子来进行总结如下: 写一个用户信息提交页面,通过这个页 ...

  10. php pdo 中文乱码,php pdo oracle中文乱码的快速解决方法

    在/etc/profile.d/简历oracle.sh 内容如下在NLS_LANG设置编码ORACLE_HOME=/usr/lib/oracle/12.1/client64 C_INCLUDE_PAT ...

最新文章

  1. 把数学函数印在T恤上却被告侵权,这位程序员怒了
  2. 根据名字,获取线程,进程。
  3. 2.2.2 进程调度的 时机 切换与过程 调度方式
  4. nyoj-小明的密钥(362)--数论
  5. android 图片转base64内存变大了_开发者最喜爱的图片编码格式:opencv编码,解码,显示base64图片...
  6. Python JavaScript 的数组去重
  7. C语言:fseek与ftell函数
  8. python求15 17 23 65 97的因数_Python学习记录15
  9. selenium-登录腾讯防水墙案例
  10. 联通速品简易测试报告
  11. 应用软件安全编程资源使用安全
  12. 谭浩强C++ 第一章(第三版)
  13. 以计算机思维思考当下面向未来,面向未来的核心素养:从运算能力到计算思维...
  14. springboot项目中访问不到html页面问题
  15. 符号函数sign(x)
  16. 访问远程Redis服务。Connect to Remote Redis Server
  17. MATLAB/simulink学习笔记(二)——对正弦函数判断的正负以及分段函数仿真
  18. 深度之眼 PyTorch 训练营第 4 期(5):构建模型 torch.nn.Module
  19. python读取手机文件_python 读取 网络 文件
  20. 大学生创新创业训练计划如何获得国家级立项

热门文章

  1. 不同的count用法
  2. win7音量图标不见了 点显示它图标和通知 提示但前未处于活动
  3. 对话周傲英:数据库人的切肤之痛
  4. c#未能加载程序集oracle.dataaccess,未能加载文件或程序集“Oracle.DataAccess, Version=2.112.1.0解决方案...
  5. 未能加载文件或程序集“Newtonsoft.Json, Version=4.5.0.0
  6. 川大计算机学院李川,川大计算机学院硕导名单_跨考网
  7. matlab中分号、冒号、逗号等常用标点符号的作用
  8. 通达信筹码循环指标源码 显示吸筹拉升出货的过程
  9. HDU-4826 Labyrinth(DP)
  10. 电离释放型动态水处理器