首页 后端开发 php教程 PHP中的字符串、编码、UTF-8的代码详解

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

Mar 06, 2017 am 09:54 AM

  最近看了不少编码方面的文章,所以分二篇博文说下“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 = &#39;softdrink&#39;;
    public static $ale = &#39;ale&#39;;
    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[&#39;arr4&#39;][0]}\n"; 
echo "line3:{$obj->data[1]}\n";
echo "line4:{${$arr[&#39;arr3&#39;]}}\n";
echo "line5:{${$arr[&#39;arr3&#39;]}[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的代码详解的内容,更多相关内容请关注PHP中文网(www.php.cn)!


本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

如何设置 Visual Studio Code (VS Code) 进行 PHP 开发 如何设置 Visual Studio Code (VS Code) 进行 PHP 开发 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也称为 VS Code,是一个免费的源代码编辑器 - 或集成开发环境 (IDE) - 可用于所有主要操作系统。 VS Code 拥有针对多种编程语言的大量扩展,可以轻松编写

您如何在PHP中解析和处理HTML/XML? 您如何在PHP中解析和处理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示了如何使用PHP有效地处理XML文档。 XML(可扩展的标记语言)是一种用于人类可读性和机器解析的多功能文本标记语言。它通常用于数据存储

我后悔之前不知道的 7 个 PHP 函数 我后悔之前不知道的 7 个 PHP 函数 Nov 13, 2024 am 09:42 AM

如果您是一位经验丰富的 PHP 开发人员,您可能会感觉您已经在那里并且已经完成了。您已经开发了大量的应用程序,调试了数百万行代码,并调整了一堆脚本来实现操作

在PHP API中说明JSON Web令牌(JWT)及其用例。 在PHP API中说明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

php程序在字符串中计数元音 php程序在字符串中计数元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符组成的序列,包括字母、数字和符号。本教程将学习如何使用不同的方法在PHP中计算给定字符串中元音的数量。英语中的元音是a、e、i、o、u,它们可以是大写或小写。 什么是元音? 元音是代表特定语音的字母字符。英语中共有五个元音,包括大写和小写: a, e, i, o, u 示例 1 输入:字符串 = "Tutorialspoint" 输出:6 解释 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。总共有 6 个元

解释PHP中的晚期静态绑定(静态::)。 解释PHP中的晚期静态绑定(静态::)。 Apr 03, 2025 am 12:04 AM

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

什么是PHP魔术方法(__ -construct,__destruct,__call,__get,__ set等)并提供用例? 什么是PHP魔术方法(__ -construct,__destruct,__call,__get,__ set等)并提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些?PHP的魔法方法包括:1.\_\_construct,用于初始化对象;2.\_\_destruct,用于清理资源;3.\_\_call,处理不存在的方法调用;4.\_\_get,实现动态属性访问;5.\_\_set,实现动态属性设置。这些方法在特定情况下自动调用,提升代码的灵活性和效率。

See all articles