关于php的字符串编码

PHP中的字符串可以用四中方式来定义:

单引号,双引号,Nowdoc结构 , heredoc 结构

也就说用这四中方式命名的字符串不管有没有值,都是字符串类型的变量。

但是,字符串遍历是已经定义好了怎么操作这些字符串,就需要考虑,当截取中文的时候大部分我们都会用substr但是都会有出现乱码的经历,这就是因为php的字符串编码方式的原因;

php手册中关于字符串定义部分有这样一部分,一个字符串 string 就是由一系列的字符组成,其中每个字符等同于一个字节。这意味着 PHP 只能支持 256 的字符集,因此不支持 Unicode 。这句话的意思也就是不支持多字节的编码的方式所以当用substr截取中文的时候会出现乱码,因为中文如果是gbk编码的话会占用两个字节,UTF8编码的话会占用三个字节,也就是说一个中文字的如果用strlen统计的话长度会是2或是3,这也就是substr出现乱码的原因。

字符串类型:

PHP 中的 string 的实现方式是一个由字节组成的数组再加上一个整数指明缓冲区长度。并无如何将字节转换成字符的信息,由程序员来决定。字符串由什么值来组成并无限制(也就是字符串可以使二进制方式,十六进制方式等等其他方式)。字符串类型的此特性解释了为什么 PHP 中没有单独的“byte”类型 - 已经用字符串来代替了。返回非文本值的函数 - 例如从网络套接字读取的任意数据 - 仍会返回字符串。

由于 PHP 并不特别指明字符串的编码,那字符串到底是怎样编码的呢?例如字符串 "á" 到底是等于 "\xE1"(ISO-8859-1),"\xC3\xA1"(UTF-8,C form),"\x61\xCC\x81"(UTF-8,D form)还是任何其它可能的表达呢?答案是字符串会被按照该脚本文件相同的编码方式来编码。因此如果一个脚本的编码是 ISO-8859-1,则其中的字符串也会被编码为 ISO-8859-1,以此类推。不过这并不适用于激活了 Zend Multibyte 时;此时脚本可以是以任何方式编码的(明确指定或被自动检测)然后被转换为某种内部编码,然后字符串将被用此方式编码。注意脚本的编码有一些约束(如果激活了 Zend Multibyte 则是其内部编码)- 这意味着此编码应该是 ASCII 的兼容超集,例如 UTF-8 或 ISO-8859-1。不过要注意,依赖状态的编码其中相同的字节值可以用于首字母和非首字母而转换状态,这可能会造成问题。也就是说不要依据文本的编码方式来处理字符串应该使用mbstring这种方式来处理。

 

当然了,要做到有用,操作文本的函数必须假定字符串是如何编码的。不幸的是,PHP 关于此的函数有很多变种:

  • 某些函数假定字符串是以单字节编码的,但并不需要将字节解释为特定的字符。例如 substr()strpos()strlen() 和strcmp()。理解这些函数的另一种方法是它们作用于内存缓冲区,即按照字节和字节下标操作。
  • 某些函数被传递入了字符串的编码方式,也可能会假定默认无此信息。例如 htmlentities() 和 mbstring 扩展中的大部分函数。
  • 其它函数使用了当前区域(见 setlocale()),但是逐字节操作。例如 strcasecmp()strtoupper() 和 ucfirst()。这意味着这些函数只能用于单字节编码,而且编码要与区域匹配。例如 strtoupper("á") 在区域设定正确并且 á 是单字节编码时会返回 "Á"。如果是用 UTF-8 编码则不会返回正确结果,其结果根据当前区域有可能返回损坏的值。
  • 最后一些函数会假定字符串是使用某特定编码的,通常是 UTF-8。intl 扩展和 PCRE(上例中仅在使用了 u 修饰符时)扩展中的大部分函数都是这样。尽管这是由于其特殊用途,utf8_decode() 会假定 UTF-8 编码而 utf8_encode() 会假定 ISO-8859-1 编码。

最后,要书写能够正确使用 Unicode 的程序依赖于很小心地避免那些可能会损坏数据的函数。要使用来自于 intl 和mbstring 扩展的函数。不过使用能处理 Unicode 编码的函数只是个开始。不管用何种语言提供的函数,最基本的还是了解 Unicode 规格。例如一个程序如果假定只有大写和小写,那可是大错特错。

转载于:https://www.cnblogs.com/phplhs/p/3668353.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432680.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 获取打印机缺纸_JAVASE 语言概述和JAVA

第一章:开发前言计算机分为硬件和软件,一般来说。硬件就是组成计算机的可见的物理组件。我们的电脑、手机、电子设备都算一个小的计算机。而软件提供看不见的指令,这些指令控制硬件并且通过硬件完成特定任务。常见硬件:CPU、内存、…

计算机图形处理与应用程序,计算机图形处理与应用

本文主要介绍了计算机图形图像处理的基本概念;导出三维图形几何变换矩阵的一般形式;简要介绍了消隐技术;介绍了AutoLISP语言的功能、特点及绘图程序,并结合简单实例,展示了开发的实际效果。计算机图形处理及其应用摘要计算机图像处理技术产生于上个世纪80年代末,经历…

ARM Linux 3.x的设备树(Device Tree)

宋宝华 Barry Song <21cnbaogmail.com>1. ARM Device Tree起源 Linus Torvalds在2011年3月17日的ARM Linux邮件列表宣称“this whole ARM thing is a f*cking pain in the ass”&#xff0c;引发ARM Linux社区的地震&#xff0c;随后ARM社区进行了一系列的重大修正。在…

冯诺依曼原理中计算机包括功能部件,水泥越细,强度发展越快,对混凝土性能也越好...

现象其结定相同的不一果却&#xff0c;水泥现象现象现象确定模糊机现非随随机&#xff0c;下同的条件在相&#xff0c;称为。、越细越快也效期望强度联性某价C激励激励、关值B水平&#xff0c;需要学习得到的机脱产会”“我非常是否属于。下面不是哪个功能够完成的操作页能开始…

win7连接sftp_SFTP远程连接服务器上传下载文件-vs2013项目实例

本项目仅测试远程连接服务器&#xff0c;支持上传&#xff0c;下载文件&#xff0c;更多功能开发请看API自行开发。环境&#xff1a;win7系统&#xff0c;vs2013vs2013项目实例下载地址&#xff1a;CSDN下载如果没有CSDN积分&#xff0c;百度网盘下载(密码&#xff1a;uqob)文件…

累觉不爱

不知不觉已经九年了&#xff0c;再过一个年头就满十了。 记得刚入职AI的时候&#xff0c;看着有人捧着个十年奉献奖的时候&#xff0c;心里还是有些小小的鄙夷的。那时候朝气蓬勃&#xff0c;充满自信&#xff0c;什么都是不放在眼里的。 在AI的前五年&#xff0c;即是成长最快…

南科大计算机系实力a,五大竞赛学科A+高校排行榜发布!北大实力碾压,科大赶超清华...

什么是学科评估&#xff1f;学科评估是教育部官方针对全国大学的专业实力进行分档而得到的&#xff0c;在评价高校的单一专业实力方面非常权威。学科评估分为A、A、A-、B等共9个等级&#xff0c;每个等级内的高校不再另做排名&#xff0c;只为等级不排名次。其中学科评估为A的要…

设置最大值_变频器用远传压力表控制恒压供水参数设置

变频器控制恒压供水的应用介绍在这里以台达变频器为例&#xff0c;利用远传压力表作为反馈信号。控制要求&#xff1a;① 恒压供水变频器的启动和停止&#xff0c;要求用数字面板操作器来控制启停&#xff1b;② 设定压力值要求用数字面板上下键来设定压力(数字0-50对应0-压力表…

为什么中国的程序员总被称为码农?

实际上IT行业在中国并不是特别差的行业&#xff0c;而程序员的工资也并不低&#xff0c;但为什么中国的程序员总被称作码农或者说是苦逼的程序员&#xff1f;中国的程序员生活和欧美的有什么不一样&#xff1f; 编程活动和机械电子一样可以视为一种工艺&#xff08;craftsmansh…

pin controller driver代码分析

一、前言 对于一个嵌入式软件工程师&#xff0c;我们的软件模块经常和硬件打交道&#xff0c;pin control subsystem也不例外&#xff0c;被它驱动的硬件叫做pin controller&#xff08;一般ARM soc的datasheet会把pin controller的内容放入GPIO controller的章节中&#xff09…

计算机调节音量找不到,电脑右下角的小喇叭不见了?教你这样操作,轻松调节音量!...

原标题&#xff1a;电脑右下角的小喇叭不见了&#xff1f;教你这样操作&#xff0c;轻松调节音量&#xff01;一般情况下&#xff0c;如果我们需要调节音量&#xff0c;可以直接通过电脑右下角的小喇叭调节&#xff0c;它是电脑声音设备的图标。但是&#xff0c;最近有位朋友想…

lm opencv 算法_OpenCV进行图像相似度对比的几种办法

// PSNR.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include // Console I/O#include // String to number conversion#include // Basic OpenCV structures#include // Image processing methods for the CPU#include // Read images#include // GPU…

android程序获取WIFI的IP地址和MAC地址

转自&#xff1a;http://my.oschina.net/chenj/blog/68680 近日在鼓捣这玩意&#xff0c;拿出来大家分享一下&#xff0c;代码比较简单&#xff0c;如果有不懂的再问 <Button android:id"id/btn"android:text"获取IP"android:layout_width"fill_pa…

计算机d,计算机词汇d

data block 数据块data connection 数据连接Data Control Language (DCL) 数据控制语言 (DCL)data definition 数据定义data definition language (DDL) 数据定义语言 (DDL)data dictionary 数据字典data dictionary view 数据字典视图data explosion 数据爆炸data file 数据文…

a5d2 mac 驱动分析

2.6内核以后的多数驱动都是基于平台总线驱动模型(platform)&#xff0c;对于平台总线来说&#xff0c;无非是两块组成 platform_driver和platform_device&#xff0c;在a5d2的bsp中&#xff0c;因为引入了device tree&#xff0c;因此&#xff0c;代码里已经看不到 platform_…

10以内的分解与组成怎么教_【一年级数学】(上)10以内的分与合技巧及练习题...

《10以内的分与合》知识点数的组成&#xff1a;一个数(1除外)分成几和几&#xff0c;先把这个数分成1和几&#xff0c;依次分到几和1为止。例如&#xff1a;5的组成有1和4、2和3、3和2、4和1。把一个数分成几和几时&#xff0c;要有序地进行分解&#xff0c;防止重复或遗漏。《…

linux下swftools 的配置

1、安装所需的库和组件。机器之前安装过了&#xff0c;主要安装的是下面几个组件。如果不安装会提示machine x86_64-unknown-linux not recognizedyum install gcc* automake zlib-devel libjpeg-devel giflib-devel freetype-devel2、下载编译安装swftools。wget http://www.s…

交通与计算机杂志社,交通信息与安全

期刊名称&#xff1a;交通信息与安全主管单位&#xff1a;中华人民共和国教育部主办单位&#xff1a;武汉理工大学;交通计算机应用信息网期刊级别&#xff1a;国家级国际刊号&#xff1a;ISSN&#xff1a;1674-4861国内刊号&#xff1a;CN&#xff1a;42-1781/U邮发代号&#x…

k1658停运到什么时候_最近网传的春节快递停运时间表,是假的!

“我有货&#xff0c;你有钱&#xff0c;其间没有快递员。”最近&#xff0c;杭州市民梁先生的朋友圈里&#xff0c;突然火了一张图片。标记为2019年日历的这张图片上&#xff0c;1月25日和2月12日之间的日期都被白线框定&#xff0c;并打出了“其间没有快递员”的字样。还有一…