MySQL 常见乱码问题及其解决办法系列文章

常见容易导致页面乱码的几个情况说明

如果你遇到乱码问题,可以从下面几个问题逐步检查:

(1)检查你的文件存储编码是否和 meta 声明的一致,假如你的文件是按照 utf-8 编码存储,但是 meta 却声明为 gb2312 ,将导致乱码。

解决办法:将页面存储编码和 meta 声明保持一致。用记事本打开文件,“另存为”,下面有个选项是“编码”,选择和 meta 声明一致的编码方式。(提示:meta 的编码声明要放在 title 标签前面,否则容易导致页面空白。)

(2)检查你的数据库连接有没有设置连接方式(SET NAMES),MySQL 4.1 版本以后,如果你没有设置数据库连接方式,那么插入或者查询将出现乱码情况。

解决办法:在你的数据库连接后面(通常是在 mysql_connect 后面,执行任何查询之前)加上一句 :

 
mysql_query("SET NAMES utf8");

其中 utf8 需要根据你需要设置。

(3)检查你的页面编码、meta 声明、数据库连接方式(SET NAMES)是否一致,如果你的页面和meta设置为gb2312,但是却在程序中设置 SET NAMES utf8,同样会导致乱码。原因是如果页面设置为 gb2312 ,那么表单中的数据也是按照 gb2312 提交,但是程序却要求按照 utf8 去处理,结果自然是乱码。

解决办法:将页面编码、meta 声明、数据库连接方式(SET NAMES)保持一致,当然这里说的一致不是绝对的,如 MySQL 的 utf8 和页面中的 utf-8 是不一样的,具体要根据你的实际情况设置。

不同字符集数据表转换出现乱码的解决办法

前段时间帮客户将 phpbb 2 迁移到 Discuz! 5,客户要求论坛数据不能有太大损失,本来已经找到了一个转换程序,可以将原有数据迁移到新的数据表中,结果转换后发现页面上全是乱码。仔细研究发现:phpbb 安装是按照默认的字符编码 latin1 ,而 Discuz! 用的是 gbk ,也就是标题说的“不同字符集数据表转换出现乱码”。

解决方法是转换数据编码方式:

第一步:将数据导出成期望的字符编码:

 
mysqldump -u用户名 -p密码 --default-character-set=原字符集 --set-charset=期望字符集 --skip-opt 数据库名 > 导出的文件名.sql

在上文提到的例子中,用下面的命令:

 
mysqldump -uroot -p*** --default-character-set=latin1 --set-charset=gbk --skip-opt phpbb> phpbb_gbk.sql

第二步:建立一个期望字符集的临时数据库:

 
CREATE DATABASE `phpbb_gbk` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;

注意:这个是上文提到的例子中所用的命令,具体到实际应用时,要根据需要设置。

第三步:将第一步备份的数据导入到这个新创建的临时数据库里面:

 
mysql -u用户名 -p密码 --default-character-set=期望字符集 -f 数据库名<第一步备份的文件名.sql

在我的例子中是用下面的命令:

 
mysql -uroot -p*** --default-character-set=gbk -f phpbb_gbk<phpbb_gbk.sql

然后就可以在这两个数据库之间执行转换程序了。

NuSOAP 调用 Web Service 乱码问题及其解决方法

NuSOAP 是 PHP 环境下的 WEB 服务编程工具,用于创建或调用 WEB 服务。它是一个开源软件,完全由PHP语言编写,由一系列 PHP 类组成,不需要扩展库的支持,这种特性使得 NuSOAP 可以用于所有的 PHP 环境,不受服务器安全设置的影响。

许多使用 NuSOAP 调用 .NET Web Service 的朋友可能都遇到过中文乱码问题,本文介绍这一问题的出现的原因和相应的解决方法。

NuSOAP 调用 Web Service 出现乱码的原因:

通常我们进行 Web Service 开发时都是用的 UTF-8 编码,这时我们需要设置 :

 
$client->soap_defencoding = 'utf-8';

同时,需要让 xml 以同样的编码方式传递:

 
$client->xml_encoding = 'utf-8';

到现在,应该是一切正常了才对,但是我们在输出结果的时候,却发现,返回的是乱码。

NuSOAP 调用 Web Service 出现乱码的解决方法:

实际上,开启了调试功能的朋友,相信会发现 $client->response 返回的是正确的结果,为什么 $result = $client->call($action, array(‘parameters’ => $param)); 却是乱码呢?

研究过 NuSOAP 代码后我们会发现,当 xml_encoding 设置为 UTF-8 时,NuSOAP 会检测 decode_utf8 的设置,如果为 true ,会执行 PHP 里面的 utf8_decode 函数,而 NuSOAP 默认为 true,因此,我们需要设置:

 
$client->soap_defencoding = 'utf-8';
$client->decode_utf8 = false;
$client->xml_encoding = 'utf-8';

计算 UTF-8 字符串长度(忽略字节的方案)

本文介绍的函数可以统计 UTF-8 字符串的长度,但不同的是,该函数并不考虑字节,这有些类似 Javascript 中字符串的 length 方法,一个字符全部按 1 个长度计算。

 
<?php
// 说明:计算 UTF-8 字符串长度(忽略字节的方案)
// 整理:http://www.CodeBit.cn

function strlen_utf8($str)
{
	$i = 0;
	$count = 0;
	$len = strlen ($str);
	while ($i < $len)
	{
		$chr = ord ($str[$i]);
		$count++;
		$i++;
		if($i >= $len)
			break;

		if($chr & 0x80)
		{
			$chr <<= 1;
			while ($chr & 0x80)
			{
				$i++;
				$chr <<= 1;
			}
		}
	}
	return $count;
} 

$str = "Codebit.cn - 聚合小段精华代码";

echo strlen_utf8($str);

?>

上面的代码将返回 21。