最近看了很多编码方面的文章,所以分成两篇博文来谈谈“PHP、字符串、编码、UTF-8”相关知识。 本博文为上半部分,分为四大部分,分别是“字符串的定义与使用”、“字符串转换”、“PHP字符串的本质”、“多字节字符串”。 前半部分比较基础,下一篇《PHP与UTF-8的最佳实践》可能会更干一点。
字符串的定义和使用
PHP 中有四种设置字符串的方法:
单冒号字符串
单冒号字符串类似于Python中的原始字符串,也就是说单冒号字符串没有变量解析功能和特殊字符通配符功能。 例如,$str='hellonworld',其中 n 没有换行函数。
双冒号字符串
双冒号字符串具有单冒号字符串所不具备的变量解析功能和特殊字符通配符功能。
就我个人而言,我对十六补码和八补码字符串的特殊通配符非常感兴趣,它们具有很强的补充性:
[0-7]{1,3} #八进制表达方式
x[0-9A-Fa-f]{1,2} #十六进制表达方式
特雷多克
这些表达式类似于 Python 中的长字符串php 字符串包含,用于定义包含多行的字符串。 它的语法定义非常严格,使用时需要注意。
$str=<<<EOD
hellon
world
EOD;
诺多克
Nowdoc 就像单个冒号字符串并且不解析变量。 定义一大段文本而不用通配符其中的特殊字符是更合适的。
可变分辨率
PHP 字符串最强大的部分是变量解析。 变量可以在运行时根据上下文进行解析(这是一种解释性语言),可以形成很多奇妙的用途。
简单的变量解析是指字符串中可以包含“变量”、“数组”和“对象属性”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";
字符串转换
PHP语言比Python简单的另一个原因是类型的隐式转换,这简化了很多操作。 这里我们用字符串转换来说明。
字符串类型强制
$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被转换为字符串的“1”。 最好了解相关规则。
手动类型转换
其中的两个转换属于显示转换,更要注意的是手动类型转换。 在需要字符串的表达式中,它将被手动转换为类型。 详细信息请参见示例:
$bool = true;
$str = 10 + "hello"
echo $bool . "_" . $str ;
PHP 字符串的性质
引用PHP文档的解释:
PHP中string的实现方式是一个由字节加上一个表示缓冲区宽度的整数组成的字段。 没有关于如何将字节转换为字符的信息,这取决于程序员。 对于字符串由哪些值组成没有限制,包括可以出现在字符串中任何位置的值为 0 的字节。
PHP 并没有太多指定字符串的编码。 字符串的编码方式取决于程序员。 String将根据PHP文件的编码对字符串进行编码。 比如你的文件编码是GBK,那么你的代码内容就全是GBK。
为了补充补码安全的概念,值为0(NULL)的字节可以位于字符串中的任何位置,PHP中一些非补码函数的底层是调用的C函数,它忽略了NULL 之前的字符。
只要PHP文件编码兼容ASCII,就可以很好地处理字符串操作。 并且字符串操作本质上仍然是原生的(与文件编码无关),因此使用时需要注意:
通常情况下,即使PHP内部不支持Unicode字符,而支持UTF-8编码,大多数情况下也不会出现问题,并且可能无法处理以下情况:
那么如何解决这个问题呢? PHP提供mbstring扩展!
多字节字符串
mbstring 扩展默认不启用,安装时需要 --enable-mbstring。
我们先看一下PHP.INI中mbstring命令的配置,花了很长时间才逐渐了解。
我们来看看mbstring扩展的一些功能:
关键点是:PHP文件支持的编码必须兼容ASCII。
但是,不要使用 BIG-5 作为 PHP 文件编码,特别是当字符串以标识符或文字形式出现时。 如果PHP文件编码为BIG-5,请尝试将输入输出内容转换为UTF-8。
Zend多字节
最后说一下ZendMultibyte的概念。 我理解的不是很深。 首先,不要将它与 mbstring 扩展混合在一起。 ZendMultibyte 模式默认关闭,可以通过 zend.multibyte 命令打开。 然后使用declare()函数指定PHP解析器的编码。
这条指令的含义是什么? 都说PHP文件的编码必须兼容ASCII,那么如何处理像BIG-5这样不兼容的ASCII编码,就可以使用这个命令来操作,当PHP解析器读取到mbstring.script_encoding编码并使用这种编码来解析 PHP 文件。
下一篇博文《PHP与UTF-8的最佳实践》,有兴趣的可以看一下。
通过: