问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何解决PHP中文乱码问题?

发布网友 发布时间:2022-04-06 00:32

我来回答

1个回答

热心网友 时间:2022-04-06 02:01

作为该国家/区域内信息处理的基础,字符编码集起着统一编码的重要作用。字符编码集按长度分为 SBCS(单字节字符集),DBCS(双字节字符集)两大类。早期的软件(尤其是操作系统),为了解决本地字符信息的计算机处理,出现了各种本地化版本 (L10N),为了区分,引进了 LANG, Codepage 等概念。但是由于各个本地字符集代码范围重叠,相互间信息交换困难;软件各个本地化版本独立维护成本较高。因此有必要将本地化工作中的共性抽取出来,作一 致处理,将特别的本地化处理内容降低到最少。这也就是所谓的国际化(118N)。各种语言信息被进一步规范为 Locale 信息。处理的底层字符集变成了几乎包含了所有字形的 Unicode。
现在大部分具有国际化特征的软件核心字符处理都是以 Unicode 为基础的,在软件运行时根据当时的ocale/Lang/Codepage 设置确定相应的本地字符编码设置,并依此处理本地字符。在处理过程中需要实现 Unicode 和本地字符集的相互转换,甚或以 Unicode 为中间的两个不同本地字符集的相互转换。这种方式在网络环境下被进一步延伸,任何网络两端的字符信息也需要根据字符集的设置转换成可接受的内容。
数据库中的字符集编码问题
流行的关系数据库系统都支持数据库字符集编码,也就是说在创建数据库时可以指定它自 己的字符集设置,数据库的数据以指定的编码形式存储。当应用程序访问数据时,在入口和出口处都会有字符集编码的转换。对于中文数据,数据库字符编码的设置 应当保证数据的完整性。GB2312、GBK、UTF-8 等都是可选的数据库字符集编码;当然我们也可以选择 ISO8859-1 (8-bit),只是我们得在应用程序写数据之前先将 16Bit 的一个汉字或 Unicode 拆分成两个 8-bit 的字符,读数据之后也需要将两个字节合并起来,同时还要判别其中的 SBCS 字符,因此我们并不推荐采用 ISO8859-1 作为数据库字符集编码。这样不但没有充分利用数据库自身的字符集编码支持,而且同时也增加了编程的复杂度。编程时,可以先用数据库管理系统提供的管理功能 检查其中的中文数据是否正确。
PHP 程序在查询数据库之前,首先执行 mysql_query("SET NAMES xxxx"); 其中 xxxx 是你网页的编码(charset=xxxx),如果网页中 charset=utf8,则 xxxx=utf8,如果网页中 charset=gb2312,则xxxx=gb2312,几乎所有 WEB 程序,都有一段连接数据库的公共代码,放在一个文件里,在这文件里,加入 mysql_query("SET NAMES xxxx") 就可以了。
定位问题时常用的技巧
定位中文编码问题通常采用最笨的也是最有效的办法―在你认为有嫌疑的程序处理后打印 字符串的内码。通过打印字符串的内码,你可以发现什么时候中文字符被转换成 Unicode,什么时候Unicode 被转回中文内码,什么时候一个中文字成了两个 Unicode 字符,什么时候中文字符串被转成了一串问号,什么时候中文字符串的高位被截掉了。
解决各种应用的乱码问题
使用标签设置页面编码
这个标签的作用是声明客户端的浏览器用什么字符集编码显示该页面,xxx 可以为 GB2312、GBK、UTF-8(和 MySQL 不同,MySQL 是 UTF8)等等。因此,大部分页面可以采用这种方式来告诉浏览器显示这个页面的时候采用什么编码,这样才不会造成编码错误而产生乱码。但是有的时候我们会 发现有了这句还是不行,不管 xxx 是哪一种,浏览器采用的始终都是一种编码,这个情况我后面会谈到。
请注意, 是属于 HTML 信息的,仅仅是一个声明,仅表明服务器已经把 HTML 信息传到了浏览器。
header("content-type:text/html; charset=xxx");
这个函数 header() 的作用是把括号里面的信息发到 http 标头。如果括号里面的内容为文中所说那样,那作用和 标签基本相同,大家对照第一个看发现字符都差不多的。但是不同的是如果有这段函数,浏览器就会永远采用你所要求的 xxx 编码,绝对不会不听话,因此这个函数是很有用的。为什么会这样呢?那就得说说 http 标头和 HTML信息的差别了:
http 标头是服务器以 http 协议传送 HTML 信息到浏览器前所送出的字串。而 标签是属于 HTML 信息的,所以 header() 发送的内容先到达浏览器,通俗点就是 header() 的优先级高于 (不知道可不可以这样讲)。假如一个 php 页面既有header("content-type:text/html;charset=xxx"),又有,浏览器就只认前者 http 标头而不认 meta 了。当然这个函数只能在 php 页面内使用。
AddDefaultCharset
Apache 根目录的 conf 文件夹里,有整个 Apache 的配置文档 httpd.conf。
用文本编辑器打开 httpd.conf,第 708 行(不同版本可能不同)有 AddDefaultCharset xxx,xxx为编码名称。这行代码的意思:设置整个服务器内的网页文件 http 标头里的字符集为你默认的 xxx字符集。有这行,就相当于给每个文件都加了一行 header("content-type:text/html; charset=xxx")。这下就明白为什么明明 设置了是 utf-8,可浏览器始终采用 gb2312 的原因。
如果网页里有 header("content-type:text/html; charset=xxx"),就把默认的字符集改为你设置的字符集,所以这个函数永远有用。如果把 AddDefaultCharset xxx 前面加个"#",注释掉这句,而且页面里不含 header("content-type…"),那这个时候就轮到 meta 标签起作用了。
下面列出以上的优先顺序:
.. header("content-type:text/html; charset=xxx")
如果你是 web 程序员,建议给你的每个页面都加个header("content-type:text/html;charset=xxx"),这样就可以保证它在任何服务器都能正确显示,可移植性也比较强。
php.ini 中的 default_charset 配置
php.ini 中的 default_charset = "gb2312" 定义了 php 的默认语言字符集。一般推荐注释掉此行,让浏览器根据网页头中的 charset 来自动选择语言而非做一个强制性的规定,这样就可以在同台服务器上提供多种语言的网页服务。
其实 php 开发中的中文编码并没有想像的那么复杂,虽然定位和解决问题没有定规,各种运行环境也各不尽然,但后面的原理是一样的。了解字符集的知识是解决字符问题的 基础。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
信息系统集成资质几级最高 计算机信息系统集成企业资质等级评定条件计算机信息系统集成企业资质等 ... 计算机信息系统集成企业资质等级评定条件实施细则一级资质 win10电脑密码错误win10开机密码错误 windows怎么更换密码错误 电脑没设置密码老是显示密码不正确电脑密码一直显示输入不正确 我把苹果手机系统 。 一更新 。 卡着了 。 然后就这样了 。 这出现... 我iphone想更新到9,是直接在手机按的更新,但是中途变成了这样 为什么有时早上4点多觉胸一下感觉很累的像给人吓一跳似 睡觉醒来时觉得胸部难受有点累是怎么回事 浏览器怎么打开中文名字的PHP文件会出现乱码?是PHP文件不能以中文命名么? php中文乱码怎么解决 php创建中文文件名出错怎么解决? php文件夹处理时遇到中文出错 php文件上传问题如何解决,不能上传中文文件名的文件? 谷歌浏览器75.0.3770.100版本如何添加flash插件? 谷歌浏览器如何添加插件 谷歌浏览器显示不是私密连接怎么办 Chrome浏览器访问网页时出现您的连接不是私密连接,打不开https网页,该怎么办? 谷歌浏览器不是私密连接怎么解决 谷歌浏览器访问网页出现“您的连接不是私密连接”该怎么解决? 为什么我谷歌浏览器显示不了图片 我用的是chrome浏览器为什么我打开网上chrome网上应用点看不到图片 关于chrome 浏览器看图片和视频的问题。 为什么有的网页图片显示不了 求大神指教 本人用的谷歌浏览器 谷歌浏览器经常显示不了图片,为什么啊? 谷歌浏览器出现了图片打不开的问题 谷歌浏览器有些图片看不见,难道是中病毒? 百度贴吧 无法看见图片 所有图片都是一片空白, 我进百度贴吧老是不显示图片是为什么啊? php遍历到的文件是中文文件名 显示为乱码 该如何解决 为什么php制作网页中无法正常显示中文 .php 文件的文件名是否不能含汉字?? 让php文件名为中文,或者所在文件夹为中文的php文件不会报错。开发环境wamp5 php 汉字显示错误 php上传怎么解决中文文件夹的问题?当遇到中文文件夹的时候文件就上传不了 PHP读取中文名称文件乱码,所以未能读取出文件内容 新手,php用什么工具来调试代码错误 有哪些 PHP 调试技巧? php 代码如何调试 如何让Editplus调试PHP程序,能提示错误行数. 能不能有详细一点的步骤 PHP高手指点 错误如何解决? PHP的程序是怎样调试的呢?? 如何对php项目,单个文件进行调试 在调试PHP网站后台的时候,出现一点错误,求助各位高手 php调试错误问题 syntax error, unexpected '{' 老是说这里有错,PHP怎么调试错误啊 php调试出错,数据库问题 php如何调试MVC类型的项目?控制器里面代码错就显示500错误,但页面不显示是哪一行错误。 PHP如何调试及排错