当接受未知客户端提交的数据时,由于各客户端的编码不统一,但服务器端最终只能以一种编码方式来处理,这种情况下就会涉及到编码转换的问题。

复制代码 代码如下:

// 自动转换字符集 支持数组转换

function auto_charset($fContents, $from='gbk', $to='utf-8') {

$from = strtoupper($from) == 'UTF8' ? 'utf-8' : $from;

$to = strtoupper($to) == 'UTF8' ? 'utf-8' : $to;

if (strtoupper($from) === strtoupper($to) || empty($fContents) || (is_scalar($fContents) && !is_string($fContents))) {

//如果编码相同或者非字符串标量则不转换

return $fContents;

}

if (is_string($fContents)) {

if (function_exists('mb_convert_encoding')) {

return mb_convert_encoding($fContents, $to, $from);

} elseif (function_exists('iconv')) {

return iconv($from, $to, $fContents);

} else {

return $fContents;

}

} elseif (is_array($fContents)) {

foreach ($fContents as $key => $val) {

$_key = auto_charset($key, $from, $to);

$fContents[$_key] = auto_charset($val, $from, $to);

if ($key != $_key)

unset($fContents[$key]);

}

return $fContents;

}

else {

return $fContents;

}

}

这时可能会想到直接用iconv来进行转码,但iconv这个函数需要提供的两个参数为输入编码和输出编码,而现在根本不知道接受的字符串是什么编码,如果此时能得到接收字符是什么编码就好了。

对于这个问题,有以下两种方案供参考。

方案一要客户端提交数据时,指定所提交的编码,这时就需要多给一个用来指定编码的变量。

$string = $_GET['charset'] === 'gbk' ? iconv('gbk','utf-8',$_GET['str']) : $_GET['str'];

对于这种情况,如果在没有约定或者我们不能控制客户端的情况下,似乎这种方案使用不是很好。

方案二直接由服务器端来检测所接收的数据编码。

这种方案当然是最理想了的了,现在问题是怎么检测一个字符的编码吗?对于这种情况,在php里,mb_string这个扩展中的mb_check_encoding提供了我们所需要的功能。

$str = mb_check_encoding($_GET['str'],'gbk') ? iconv('gbk','utf-8',$_GET['str']) : $_GET['str'];

但这需要打开mb_string这个扩展,有些时候可能我们的生产服务器中没有打开这个扩展。对于这种情况,需要自己借助如下函数来判断编码。

复制代码 代码如下:

function isGb2312($string) {

for($i=0; $i 127) {

if( ($v >= 228) && ($v < = 233) )

{

if( ($i+2) >= (strlen($string) - 1)) return true;

$v1 = ord( $string[$i+1] );

$v2 = ord( $string[$i+2] );

if( ($v1 >= 128) && ($v1 < =191) && ($v2 >=128) && ($v2 < = 191) )

return false;

else

return true;

}

}

}

return true;

}

function isUtf8($string) {

return preg_match('%^(?:

[\x09\x0A\x0D\x20-\x7E] # ASCII

| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte

| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs

| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte

| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates

| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3

| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15

| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16

)*$%xs', $string);

}

这里我们就可以使用以上任何一个函数来实现编码的检测,并将其转换为指定的编码了。

$str = isGb2312($_GET['str'],'gbk') ? iconv('gbk','utf-8',$_GET['str']) : $_GET['str'];

php支持 的编码,php编码转换函数(自动转换字符集支持数组转换)相关推荐

  1. c语言 格式转换函数,C语言中的格式转换函数.doc

    C语言中的格式转换函数 C语言中的格式转换函数 表头文件 #include 定义函数 double atof(const char *nptr); 函数说明 atof()会扫描参数nptr字符串,跳过 ...

  2. php把数组转换成对象,php怎么将数组转换成对象

    echoecho() 函数输出一个或多个字符串.注释:echo() 函数实际不是一个函数,所以您不必对它使用括号.然而,如果您想要传多于一个参数给 echo(),使用括号将会生成解析错误.print ...

  3. go json字符串转换成结构体,json字符串数组转换成切片

    例子1:把字符串转换成结构体:{"FromUid":"100","FromName":"HANASHAN"} packa ...

  4. c大小写转换函数_Excel中的大小写金额转换,技巧法和函数法,职场必学技巧

    财务工作中,经常需要将小写的数字,转换成大写的数字,有两种方法轻松解决,技巧法以及函数法. 小写转大写技巧法 我们选中单元格,然后右键,设置单元格格式(快捷键是CTRL+1),在弹出的设置单元格格式窗 ...

  5. python坐标系转换函数_Numpy-坐标系之间的转换

    使用Numpy我想在坐标系之间转换位置向量. 我有两个三维空间的飞机. 每个平面由其中心定义:C[0] = (X0, Y0, Z0) C[1] = (X1, Y1, Z1) (X,Y,Z指全球坐标系) ...

  6. mysql 字符转换函数是_MySQL日期和字符串转换函数

    Mysql中to_char()和str_to_date()函数 转载路径:https://blog.csdn.net/ricardo_mli/article/details/80217512 1.字符 ...

  7. java把二维转换为一维_在R语言中什么函数可以将二维数组转换成一维数组

    满意答案 vi31892i 2013.09.11 采纳率:44%    等级:11 已帮助:6956人 这好象是汇编语言的问题吧 举个例子吧 #include "iostream.h&quo ...

  8. C++专题:异常处理与转换函数,智能指针,STL模板

    目录 异常处理 转换函数 智能指针 STL标准模板库 异常处理 什么是异常? 程序中常见的错误分为两大类:编译时错误和运行时错误.编译时的错误主要是语法错误,如关键字拼写错误.语句末尾缺分号.括号不匹 ...

  9. php金币格式转换,php 资金格式转换函数_PHP教程

    // 函数名:ExchangeMoney($N_money) // 作 用:资金转换函数 // 参 数:$N_money(待转换的金额数字) // 返回值:字符串 // 备 注:本函数示例:$char ...

最新文章

  1. Git Bash Here 中文显示乱码,有遮挡, 的处理方法
  2. Tomcat - ClassFormatException的解决方法
  3. sort函数pythonreverse_Python基础 7 ---- Python内置sort和sorted函数
  4. project甘特图导出图片_云盒子预览升级,新增WPS、Visio、Project文档在线预览
  5. CVPR 2020 HAN:《Hypergraph Attention Networks for Multimodal Learning》论文笔记
  6. CodeIgniter学习笔记一
  7. 读”SQL Injection Pocket Reference”之摘录
  8. 怎么安装php模板,PHPWind八风格模板的安装及制作教程
  9. spring 监听器简介
  10. linux经典学习网站及博客
  11. Qt::WA_TransparentForMouseEvents 了解一下
  12. Python爬虫与信息提取(五)爬虫实例:爬取新浪微博热搜排名
  13. uniapp 开发小程序使用iconfont彩色图标
  14. 插入(希尔)排序时间、空间复杂度
  15. 教你如何制作并压缩高质量视频
  16. 批量复制提取Word中所有的表格到Excel(Python办公自动化)
  17. mysql使用jdbc进行批量插入时把事务设为手动提交比事务自动提交速度快了10倍
  18. 【今晚7点】:如何借助Google Cloud在海外部署音视频业务?
  19. QPS、TPS、PV、UV、RPS、IP、GMV、DAU、MAU
  20. IDEA 2020.1官网汉化插件安装

热门文章

  1. 我们很需要“企业即时通讯”
  2. 用VC写Assembly代码(5) --一些宏的使用(二)
  3. 一步步Notepad变Word
  4. STM32----摸石头过河系列(一)
  5. windows10环境tensorflow下载安装
  6. python-OpenCV图像的基本运算
  7. 她的癌细胞救了上亿条命,却很少有人知道她的名字
  8. 单细胞分析Seurat使用相关的10个问题答疑精选!
  9. javafx应用启动自动执行函数_JavaFx:Application start方法中的异常
  10. C++游戏入门书籍推荐