同样我们还是拿这个获取手机号信息的公共接口测试,它返回的内容是 GBK 的编码内容。我们可以通过 mb_convert_encoding() 来转换它的编码内容。mb_detect_encoding() 是检测编码格式,这里我们给了两个参数,它会返回符合条件的编码内容,CP936 就是 GBK 的另一种表示(IBM在制作 code page 时将 GBK 编码放在了第 936 页)。
HTTP 参数操作mb_internal_encoding("UTF-8");
首先介绍一个 mb_internal_encoding() 函数,其实就是设置当前运行环境中的默认编码规则的,如果不设置的话,就是以当前这个 php 文件的编码规则为默认的。大家了解一下,因为它会影响我们后面介绍的内容。
// // localhost:9991/?a=我上 var_dump(mb_http_input('GPC')); // bool(false) var_dump(mb_http_output()); // string(5) "UTF-8" mb_internal_encoding("CP936"); mb_parse_str($_SERVER['QUERY_STRING'], $result); print_r($result); // Array // ( // [a] => 我上 // )
首先我们运行起来测试文件,然后用浏览器请求这个链接地址。mb_http_input() 是检测 HTTP 输入字符编码,不过我测试的结果都是返回 false 。有了解的小伙伴可以留言说明下这个是什么情况。而 mb_http_output 则是设置检测输出的编码,这个就会受到 mb_internal_encoding() 所定义的内容的影响。
另外,mb_parse_str() 是 parse_str() 函数的多字节版,我们可以将浏览器的默认编码转换成 GBK 或者 之后再来请求,因为我们设置当前的 mb_internal_encoding() 为 CP936 了。在默认情况下,如果使用 UTF-8 的浏览器请求的话,这里就会报错了,这就是 mb_internal_encoding() 对这些函数的影响。
其它属性查看最后,我们再来看看一些 mb_ 相关信息属性的内容。
var_dump(mb_language()); // string(7) "neutral"
mb_language() 函数用于获取/设置当前的语言,它可以接收一个参数设置当前的语言信息。主要用于编码邮件信息 mb_send_mail() 函数就是使用它来对邮件进行编码。关于 mb_send_mail() 的使用大家可以自己尝试一下,其实也是 send_mail() 函数的多字节版。neutral 的意思是中立的,其实也是跟我们的 mb_internal_encoding() 有关。
var_dump(mb_list_encodings()); // array(86) { // [0]=> // string(4) "pass" // [1]=> // string(5) "wchar" // [2]=> // string(7) "byte2be" // [3]=> // …… // [65]=> // string(5) "CP936" // ……
mb_list_encodings() 用于展示当前系统中所支持的所有语言编码的列表,在这个列表中我们就可以看到 CP936 的身影,但是没有 GBK 哦,记住它们俩是一个东西就好了。
var_dump(mb_get_info()); // array(14) { // ["internal_encoding"]=> // string(5) "UTF-8" // ["http_output"]=> // string(5) "UTF-8" // ["http_output_conv_mimetypes"]=> // string(31) "^(text/|application/xhtml\+xml)" // ["func_overload"]=> // int(0) // ["func_overload_list"]=> // string(11) "no overload" // ["mail_charset"]=> // string(5) "UTF-8" // ["mail_header_encoding"]=> // string(6) "BASE64" // ["mail_body_encoding"]=> // string(6) "BASE64" // ["illegal_chars"]=> // int(0) // ["encoding_translation"]=> // string(3) "Off" // ["language"]=> // string(7) "neutral" // ["detect_order"]=> // array(2) { // [0]=> // string(5) "ASCII" // [1]=> // string(5) "UTF-8" // } // ["substitute_character"]=> // int(63) // ["strict_detection"]=> // string(3) "Off" // }
mb_get_info() 是查看当前环境下默认的这些语言编码的配置,比如我们熟悉的 internal_encoding 、 http_output 属性都能在这里看到。
总结用过的同学是不是也发现了今天文章的新姿势了呢?没错,GBK 和 CP936 反而成为了今天文章的意外惊喜。这个在之前确实还真没有注意到。其实 mb_ 相关的函数的使用已经非常普遍了,基本算是学习 PHP 的入门必备知识了。它还有很多的函数并没有一一地列举出来,有兴趣的同学可以多多查阅官方手册进行更加深入地学习。
测试代码:
参考文档: