PHP中的字符串、编码、UTF-8

《PHP中的字符串、编码、UTF-8》一文中描述了一些列的基础知识,比较枯燥,现在来说点有用的——PHP
字符串处理的最佳实践,本文是“PHP、字符串、编码、UTF-8”相关知识的第二部分。先说结论——
PHP 中的各个方面使用 UTF-8
编码。

最近看了不少编码方面的文章,所以分二篇博文说下“PHP、字符串、编码、UTF-8”相关知识,本篇博文是上半部分,分为四大块内容,分别是“字符串的定义和使用”、“字符串转换”、“PHP
字符串的本质”、“多字节字符串”。上半部分比较基础,下一篇文章《PHP 与
UTF-8的最佳实践》可能干货更多一点。

PHP 语言层面是不支持 Unicode字符集的,但是可以通过 UTF-8
编码能处理大部分问题。

字符串的定义和使用

PHP 中能够通过四种方法设置字符串:

单引号字符串
单引号字符串类似于 Python
中的原始字符串,也就是说单引号字符串没有变量解析功能和特殊字符转义功能。比如$str='hellonworld',其中的n澳门新葡亰娱乐在线,并没有换行功能。

双引号字符串
双引号字符串具备单引号字符串没有的变量解析功能和特殊字符转义功能。

个人对于十六进制和八进制的字符串特殊转义很感兴趣,特别补充:

[0-7]{1,3} #八进制表达方式
x[0-9A-Fa-f]{1,2} #十六进制表达方式

heredoc
这种表达式类似于 Python
中的长字符串,能够定义包含多行的字符串。其语法定义很严格,使用起来需要注意。

$str=<<<EOD
hellon
world
EOD;

Nowdoc
Nowdoc类似于单引号字符串,不会解析变量。比较适合定义一大段文本且无需对其中的特殊字符进行转义。

变量解析
PHP字符串最强大的部分就是变量解析,可以在运行时根据上下文解析变量(这才是解释型语言),可以产生很多妙用。

简单的变量解析就是在字符串中可以包含“变量”,“数组”,“对象属性”,复杂的语法规则就是使用{}符号来进行操作(组成一个表达式)。

通过一个例子看看变量解析的强大之处

class beers {
    const softdrink = 'softdrink';
    public static $ale = 'ale';
    public $data = array(1,3,"k"=>4);
}

$softdrink = "softdrink";
$ale = "ale";
$arr = array("arr1","arr2","arr3"=>"arr4","arr4"=>array(1,2));
$arr4 = "arr4";
$obj = new beers;
echo "line1:{$arr[1]}n";
echo "line2:{$arr['arr4'][0]}n"; 
echo "line3:{$obj->data[1]}n";
echo "line4:{${$arr['arr3']}}n";
echo "line5:{${$arr['arr3']}[1]}n";
echo "line6:{${beers::softdrink}}n";
echo "line7:{${beers::$ale}}n";

最佳实践就是明确知道输入编码(不知道就检测),内部统一转换为 UTF-8
编码,输出编码也统一是 UTF-8编码。

字符串转换

PHP 语言比 Python
简单的另外一个原因就是类型的隐式转换,会简化很多操作,这里通过字符串转换来说明。

PHP 层面如何处理 UTF-8

当操作 Unicode 字符集的时候,请务必安装 mbstring
扩展,并使用相应的函数代替原生的字符串函数。举个例子,一个文件编码为
UTF-8 的 PHP 代码,假如使用 strlen() 函数是错误的,请使用 mb_strlen()
函数代替。

mbstring
扩展大部分的函数都需要基于一个编码(内部编码)来处理,请务必统一使用
UTF-8 编码,这个大部分可以在 PHP.INI 中配置。

从 PHP 5.6 开始,default_charset 配置可以替换
mbstring.http_input,mbstring.http_output 。
另外一个重要的配置就是 mbstring.language,这个默认值是
Neutral(UTF-8)。

注意文件编码和 mbstring 扩展的内部编码不是同一个概念。

概括的说来:

  • PHP.INI 中涉及到 mbstring 扩展的部分尽量使用 UTF-8。
  • 请用 mbstring 扩展函数代替原生字符串操作函数。
  • 在使用相关函数的时候,请务必了解你操作的字符的编码是什么,在使用对应函数的时候,显示的写上
    UTF-8 编码参数,比如 htmlentities() 函数的第三个参数显示写上 UTF-8。

字符串类型强制转换

$var = 10 ;
$dvar = (string)$var ;
echo $dvar . "_" . gettype($dvar);

strval()函数是获取变量的字符串值:

$var = 10.2 ;
$dvar = strval($var) ;
echo gettype($var) . "_" . $dvar . "_" . gettype($dvar);

settype()函数是设置变量的类型:

$str = "10hello";
settype($str, "integer");
echo $str ;

在强制类型转换过程中,将其他类型的值转换为字符串的时候会遵循一定的规则,比如一个布尔值
boolean 的 TRUE 被转换成 string 的 “1”。相关规则最好还是理解下。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图