0

0

php汉字编码转换方法精讲

php中文网

php中文网

发布时间:2016-07-25 08:53:46

|

1206人浏览过

|

来源于php中文网

原创

本文介绍了php中汉字编码转换的一些知识,分析了php编码转换的原理与方法,有需要的朋友参考下。

有关对mysql4.1字符集的理解,再讲述如何php如何适应mysql的这种变化。 同样适用于mysql5及以上的版本。

一.原理篇 mysql的字符集里有两个概念,一个是“character set(字符集)”,另一个是“collations”。 1. collations collations翻成中文是“校验”,在网页开发的过程中,这个词汇,只在mysql里使用,主要作用是指导mysql对字符的比较,比如, ascii字符集里,collations规定了a小于b,a等于a,以及a是否等于a之类的。通常,大家基本可以忽略collations的存在,因为每个字符集都有一个默认的collations,通常,使用默认的collations就可以了。 2.字符集 与这对比的是,字符集是个更广的概念,即使是windows下普通的文本文件,也渗及到字符集的问题。不同的字符集,规定了不同的字符的编码方式。一个 character set (字符集)是一组符号和编码,比如,ascii字符集,包括的字符有:数字,大小写字母,分号、换行之类的符号,编码方式是用一个7bit表示一个字符(a的编码是65,b的编码是98)。ascii只规定了英文字母的编码,非英文语言不能用ascii编码表示,为此,不同的国家,都为自己的语言做了编码,比如,我们国家,就有gb2312编码。但每个国家之间的编码不同,也存在着一些跨平台的问题,为此,一些国际化标准组织,就制定了一些国际通用的编码,最常用的就是utf8了。ascii只对英文符号和英文字母做了编码,gb2312对英文符号,英文字母,汉字做了编码,utf8对世界上所有的语言文字做了编码,所以,gb1212的字符包含了ascii字符,utf8包含了gb2312字符。由此可见,utf8是所含最广字符的字符集,所以,在一些多语言的web系统中,一般用utf8字符集(phpmyadmin使用utf8编码)。 任何文本的存储,都渗及到字符集的概念。包括数据库,也包括普通的文本文件。

主要术语: 字符:汉字,英文字母,标点符号,拉丁文等等。 编码:将字符转换成计算机存储的格式,比如,a用65表示。 字符集:一组字符以及对应的编码方式。 a. mysql的字符集 mysql目前支持多字符集,并且,支持在不同的字符集之间转换(便于移植和支持多语言)。 mysql可以设置服务器级字符集、数据库级字符集、数据表级字符集、表列的字符集,实际上,最终使用字符集的地方是存储字符的列,比如,你设置 table1中col1列是字符类型,col1才用到了字符集,如果table1表的col2列是int类型,col2不使用字符集的概念。 服务器级字符集、数据库级字符集、数据表级字符集都是为列的字符集做默认选项的。 mysql一定有一个字符集,可以通过启动时加参数指定,也可以编译时指定,也可以在配置文件里指定。mysql服务器字符集,只是做为数据库级的默认值。创建数据库时,你可以指定字符集,如果没指定,就使用服务器的字符集。同理,创建表时,你可以指定表级的字符集,如果没指定,使用数据库的字符集做为表的字符集。创建列时,你可以指定某列的字符集,如果没指定,就使用表的字符集。 通常情况下,您只需设置服务器级的字符集,其它的数据库级,表级,以及列级的字符集,都继承自服务器级字符集。 由于utf8是最广的字符集,所以,一般情况下,我们设置mysql服务器级的字符集为utf8!

b. 普通文本的字符集问题 任何文本的存储,都存在着字符集的问题,普通文本文件也不例外。 windows2000+的系统中,打开记事本,“保存为…”对话框,就有一个选项,可以让你选择存储文本的编码方式。 通常情况下,大家都使用windows2000+的系统,都使用默认的编码,所以,不会碰到字符集的问题。 windows下,保存文本文件时,可以选择编码方式,但打开文本文件时,都是自动判断编码方式的。网上有一个用windows2000+的记事本玩移动,联通的笑话,大家可以搜搜,就是因为windows在打开文本文件时,编码判断错误引起的问题。 因为自动判断编码有时会错误,所以,有的文本文件,规定了如何识别自身所使用的编码。html文件就是一个这样的例子。 html是文本文件。存储html文件的时候,需要使用一个编码,并且,在html文件里,也使用html语法,指定了该文件所使用的编码(比如)。如果html文件没有指定编码,则浏览器自动识别文件的编码。如果html指定了编码,则浏览器使用html指定的编码。 通常情况下,html文件指定的charset和html文件自身的编码是一致的,但也有不一致的情况,如果不一致,就会导致网页乱码(此处乱码,只和文本文件有关,和数据库无关。)使用专门的网页编辑工具(比如dreamwave),会自动根据网页中的charset值来编码文件。

c. php+mysql的字符集问题 php最终生成的是文本文件,但他要取数据库里的文本,或将文本存进数据库。 由于mysql支持多字符集,默认情况下,mysql不知道php发给他的是什么编码的字符,所以,mysql要求客户端(php)告诉他存取的字符集是什么。 php通过设置character_set_client,告诉mysql,php存进数据库的是什么编码方式。 php通过设置character_set_results,告诉mysql,php需要取什么样编码的数据。 php通过设置character_set_connection,告诉mysql,php查询中的文本,使用什么编码。 mysql使用设置的编码方式存储文本。 假设mysql使用setserver来存储文本,php的character_set_client是setclient,php的 character_set_results是setresult。那么,mysql将php发来的文本,从setclient编码方式,转换成 setserver编码方式,再存入数据库,如果php取文本,mysql将文本从setserver转换成setresult,再发送给php。 php文件(最终生成的html文件)本身有个编码,如果mysql传过来的编码,与php文件自身的编码不同,那么,整个网页,必然乱码。所以,php一般将自己的编码方式,告诉mysql。 要保证不乱码,就必须将三个编码统一:一是网页自身的编码,二是html里指定的编码,三是php告诉mysql的编码(包括character_set_client和character_set_results)。 第一和第二个编码,如果使用dw之类的编辑器写的网页,通常是一致的,但用记事本写的网页,有可能不一致。 第三个编码,需要手工通知mysql。这步可以通过在php里使用mysql_query(“set names characterx”)来实现。

d.字符集的转换问题 如果小字集转换成大字符集,不会丢失数据,但大字集,转换成小字集,可能会丢失数据。 比如,utf8里有的字符,gb2312不一定有,所以,从utf8转换到gb2312可能会丢失一些字符。 但有种情况例外,先从gb2312转成utf8,再从utf8转成gb2312,这种情况是不会丢数据的,因为,刚开始转换的文本,都是gb2312里的字符,所以,整个过程都是gb2312的字符在转换,不会丢失。 正因为utf8能容纳世界上的所有字符,所以,数据库一般使用utf8编码。这使得,任何字符都可以存进utf8编码的数据库。

e. phpmyadmin乱码的问题 phpmyadmin支持多国语言,这就必定要求html页面使用utf8编码。 html页面使用utf8编码,这就必定要求phpmyadmin连接mysql时,character_set_client和character_set_results使用utf8编码。 当前情况下,php连接mysql只能是使用set names(或其它几个语句)来通知mysql的编码方式,如果没有显式的声明编码方式,都将使用latin1编码。一般的程序,都没有显式声明 character_set_client变量,所以,都是将gb2312文本,按latin1编码方式存在数据库,phpmyadmin再用utf8格式读取,肯定是乱码的。 如果php程序按正确的编码存入数据库,肯定是没有问题的。所以,需要修改的不是phpmyadmin.(虽然有时修改phpmyadmin可以解决乱码问题,但这不是问题的根本)

二.总结篇

阿里云AI平台
阿里云AI平台

阿里云AI平台

下载

1.数据库尽量使用utf8存储(修改/etc/my.cnf,在[mysqld]段加上default-character-set=utf8) (已有的数据库,先转成utf8格式) 2.php程序在查询数据库之前,执行mysql_query(“set names xxxx”);其中xxxx是你网页的编码(charset=xxxx),如果网页中charset=utf8,则xxxx=utf8,如果网页中 charset=gb2312,则xxxx=gb2312,如果网页中的charset=ipaddr,则xxxx=ipaddr (开个玩笑,没这编码) 几乎所有web程序,都有一段连接数据库的公共代码,放在一个文件里,在这文件里,加入mysql_query(“set names”)就可以了。 3.phpmyadmin不需要做改动。 4.注意,为保证网页实际编码(windows保存对话框里的编码)和他声明的编码(charset=?)是一致的,请用dw之类的工具做网页。



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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

46

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

178

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

51

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

92

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

102

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

227

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

532

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

171

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号