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

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

来历:虞斗胆 发布时刻:2016-12-13 阅览次数:

  最近看了不少编码方面的文章,所以分二篇博文说下“PHP、字符串、编码、UTF-8”相关常识,本篇博文是上半部分,分为四大块内容,分别是“字符串的界说和运用”、“字符串转化”、“PHP 字符串的实质”、“多字节字符串”。上半部分比较根底,下一篇文章《PHP 与 UTF-8的最佳实践》或许干货更多一点。

 

 字符串的界说和运用

  PHP 中能够经过四种办法设置字符串:

  单引号字符串

  单引号字符串类似于 Python 中的原始字符串,也便是说单引号字符串没有变量解析功用和特别字符转义功用。比方$str='hello\nworld',其间的\n并没有换行功用。

  双引号字符串

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

  个人关于十六进制和八进制的字符串特别转义很感爱好,特别弥补:

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

  heredoc

  这种表达式类似于 Python 中的长字符串,能够界说包括多行的字符串。其语法界说很严厉,运用起来需求留意。

$str=<<<EOD
hello\n
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";

 字符串转化

  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 被转化成 string 的 “1”。相关规矩最好仍是了解下。

  主动类型转化

  上面的二个转化归于显现转化,而更要重视的是主动类型转化,在一个需求字符串的表达式中,会主动转化为类型,详细见比方:

$bool = true;
$str = 10 + "hello"
echo $bool . "_" . $str ;

 PHP 字符串的实质

  引证 PHP 文档的解说:

PHP 中的 string 的完成方法是一个由字节组成的数组再加上一个整数指明缓冲区长度。并无怎么将字节转化成字符的信息,由程序员来决议。字符串由什么值构成没有约束,包括值为 0 的字节能够呈现在字符串的任何方位。

PHP并不特别指明字符串的编码,那字符串到底是怎样编码的呢,这取决于程序员。字符串会依照 PHP 文件的编码来对字符串进行编码。比方你的文件编码是 GBK,那么你代码内容都是 GBK的。

  弥补二进制安全这个概念,其值为 0 (NULL)的字节能够处于字符串任何方位,而 PHP 的部分非二进制函数底层是调用的 C 函数,会把 NULL 后边的字符疏忽。

 只需 PHP 的文件编码是能兼容 ASCII 的,那么字符串操作就能够很好的被处理。可是字符串操作实质上仍是 Native 的(不论文件编码是什么),所以在运用的时分需求留意:

  • 某些函数假定字符串是以单字节编码的,但并不需求将字节解说为特定的字符。比方 sbustr() 函数。
  • 许多函数是需求显现的传递编码参数,否则会从 PHP.INI 文件中获取默许值,比方 htmlentities() 函数。
  • 还有一些函数和本地区域有关,这些函数也只能是单字节操作的。

  一般状况下,尽管 PHP 内部不支撑 Unicode 字符,可是支撑 UTF-8 编码,绝大部分状况下不会有什么问题,可是下列的状况或许就处理不了了:

  • 非 UTF-8 编码字符串怎么进行转化
  • 一个 UTF-8 编码的网页,可是用户在提交表单的时分,或许运用 GBK 的编码(不恪守 meta tag)
  • 一个 UTF-8 编码的 PHP 文件,运用 strlen("我国")回来的是 6 而不是实践的字符数(2)

  那么怎么处理该问题呢? PHP 供给了 mbstring 扩展 !

 多字节字符串

  mbstring 扩展默许不是翻开的,装置的时分需求 --enable-mbstring。

  咱们首要看看 PHP.INI 中关于 mbstring 指令的装备,花了良久才逐渐了解。

  • mbstring.language 这个参数我就了解为 UTF-8 了
  • mbstring.internal_encoding 这个编码和 PHP 文件编码没有关系,只是在大部分 mbstring 函数里边需求指定待处理字符串的编码,假设不显现指定,默许就获取该参数的值,该参数的值在高版别 PHP 顶用 default_charset 参数替代了。
  • mbstring.http_input 该参数指定 HTTP input 的默许编码(不包括 GET 参数)。一般和 HTML 页面的编码保持一致,该参数的值用 default_charset 参数替代。
  • mbstring.http_output 该参数误导我了,HTTP output 是什么,PHP 输出不便是页面,怎么会有这概念?
  • mbstring.encoding_translation,这个参数关键说下,默许是封闭的,假设翻开,PHP 会对 POST 变量和上传文件的称号主动转化编码为 mbstring.internal_encoding 指定的值,不过我没有实验过,咱们能够上传一个中文名的文件。主张封闭,让程序员来处理相关问题。

  后边看看 mbstring 扩展的一些函数:

  • mb_http_input():检测 HTTP input 字符编码,觉得关于文件上传的文件名有必要处理。
  • mb_convert_encoding():比较常用的函数,留意第三个参数。
  • mb_detect_order():设置/获取字符编码的检测次序。
  • mb_list_encodings():回来体系支撑的编码列表。

  关键阐明下:PHP 文件支撑的编码有必定要,要兼容 ASCII。

  可是不要运用 BIG-5 作为 PHP 文件编码,特别字符串以 identifiers 或 literals 方式呈现,假设真实 PHP 文件编码要是 BIG-5,那么关于输入输出的内容尽量转化为 UTF-8。

 Zend Multibyte

  最终说下 Zend Multibyte 这个概念,了解的不是特别深入,首要不要和 mbstring 扩展混在一块。 Zend Multibyte 方式默许是封闭的,能够经过 zend.multibyte 指令翻开。然后经过 declare() 函数来指定 PHP 解析器的编码。

  那这个指令呈现的含义是什么?上面说过 PHP 文件的编码需求是兼容 ASCII 的,那么类似于 BIG-5 这样的非兼容 ASCII 编码怎么办,能够经过这个指令来操作,当 PHP 解析器读取 mbstring.script_encoding 编码并用该编码来解析 PHP 文件。

  下一篇博文《PHP 与 UTF-8的最佳实践》,有爱好的能够看下。

QQ群:凯发娱乐官网官方群(515171538),验证音讯:10000
微信群:加小编微信 849023636 邀请您参加,验证音讯:10000
提示:更多精彩内容重视微信大众号:全栈开发者中心(fsder-com)
m88 188bet uedbet 威廉希尔 明升 bwin 明升88 bodog bwin 明升m88.com 18luck 188bet unibet unibet Ladbrokes Ladbrokes casino m88明升 明升 明升 m88.com 188bet m88 明陞 uedbet赫塔菲官网 365bet官网 m88 help
网友谈论(共0条谈论) 正在载入谈论......
沉着谈论文明上网,回绝歹意咒骂 宣布谈论 / 共0条谈论
登录会员中心