您的位置:

php中字符串替换时导致的乱码,php防止乱码的代码

本文目录一览:

请问下php怎么处理截取字符串出现的乱码问题

利用php内置方法mb_substr截取不乱码;

1、GBK编码截取示例:

$str

=

'我是谁';

//gbk编码的字符串

echo

mb_substr($str,

0,

1,

'gbk');

//输出

mb_substr方法比substr多一个参数,用来指定字符串编码。

2、utf-8编码截取示例:

[code]

$str

=

'我abc是谁';

//utf-8编码的字符串

echo

mb_substr($str,

0,

2,

'utf-8');

//输出

我a

[/code]

中英混合也完全没有问题。

php中字符串变量乱码问题

在做php类型的web程序时,文件乱码都是由编码问题造成的 影响这个因素有四个地方:

1. 文件本身的编码 我们在用记事本或者editplus dw utraledit一类的工具保存文件的时候可以选择的 记事本默认是ansi 另外还有utf8一类的选项

2. html文件的编码 就是页面上 meta charset=“gb2312” 这样的

3.数据库的编码 就是在建立数据库的时候选择的 如果是中文的你可以选择 gb2312 或者是 gbk

4.程序和数据库连接时候的编码 就是你说的 “set names gb2312实现的功能”

只要这四个方面都正确协调 就不会出现任何问题 当然有时候我们的一些设置可能有问题 但是也不影响程序的运行 比如数据库方面 错着进去 错着出来【换句话说怎么进去怎么出来 虽然在里面的时候不对 但是出来还是对的】 程序也能正常跑起来 但是从严格上讲 这是不合适的

根据上面的分析 你的描述 我想可能是你的文件类型 保存成了utf 或者 unicode类型的

PHP 中用 explode 函数切割中文字符串,会出现乱码.如何解决

乱码指的是计算机系统不能显示正确的字符,而显示其他无意义的字符或空白,如一堆ASCII Code。所显示出来的文字统称为乱码。乱码是因为所使用的字符的源码在本地计算机上使用了错误的显示字库,或在本地计算机的字库中找不到相应于源码所指代的字符所致。

通俗点讲:

乱码就是你打开王页或邮箱,里面的字不是全中文的,而是一些乱七八糟莫名其妙的无意义的字符组合在一起。主要是计算机的字库出错所致。

1一般出现在网页,用网页上面的查看——编码——简体中文即可解决。

2 出现乱码一般是Windows系统字库的问题,可能是系统错误或不正常关机造成的,也可能是某些软件需要使用操作系统以外的字库造成的。解决办法得看具体的问题,一般情况下的Windows乱码可以通过以下三种方法解决。

第一种方法是下载 解决Windows XP SP2乱码补丁 V1.00 (华军软件园)

第二种是解决Windows系统错误造成的乱码问题,重启后用F8键激活系统菜单,进入安全模式。等系统检查完毕,硬盘没有响应后再重新正常退出并重新启动计算机,正常进入Windows,字体一般就能自动恢复。这是因为Windows在进入安全模式时会重新索引字库及整理菜单。

第三种解决方法用于修正软件造成的注册表中关于字体部分设置出错的问题。运行“Regedit”启动注册表编辑器。在“HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\fontassoc”键下有 “Associated CharSet”和“Associated DefaultFonts” 两个键。当出现汉字乱码时,这两个键中的内容就可能不正确甚至不完整。它们的正确内容应该是“Associated CharSet”内有“(默认)、ANSI(00)、GB2312(86)、OEM(FF)、SYMBOL(02)”几项串值,键值分别为“(未设置键值)、Yes、Yes、Yes、No”,而“Associated DefaultFonts”内有“(默认)、AssocSystemFont、FontPackegeDecorative、FontPackegeDontCare、FontPackegeModern、FontPackegeRoman、FontPackegeScript、FontPackegeSwiss”几项串值,键值分别为“(未设置键值)、simsun.ttf、宋体、宋体、宋体、宋体、宋体、宋体”。重新启动系统后汉字就应该显示正确了。建议您在修改前先备份注册表,以防修改错误使系统出现问题。

PHP中使用substr截取字符串出现中文乱码问题该怎么办

在PHP程序开发中,经常会执行字符串的截取操作,比如输出信息列表时,标题不宜过长,打印文章摘要时,也要执行一系列的字符串截取操作。遇到这些需求时,我们经常会想到使用substr()方法来实现,substr()对全英文字符串的截取是比较适合的。

但字符串只要出现中文字符,就有可能导致PHP

substr中文乱码,因为中文UTF-8编码,每个汉字占3字节,而GB2312占2字节,英文占1字节,截取位数不准确,substr()硬生生地将

一个中文字符“锯”成两半,造成断开的字符会把其后的..拉过来一起做一个字,所以出现了PHP substr中文乱码。

substr --- 取得部份字符串

语法 : string substr (string string, int start [, int length])

说明 :

substr( )传回 string的一部份字符串,由参数 start和 length指定。

如果 start是正数,传回的字符串将会从 string的第 start个字元开始。

Example :

?php

$rest = substr ("abcdef", 1); // returns "bcdef"

$rest = substr ("abcdef", 1, 3); // returns "bcd"

?

如果 start是负数,传回的字符串将会从 string结尾的第 start个字开始。

Example :

?php

$rest = substr ("abcdef", -1); // returns "f"

$rest = substr ("abcdef", -2); // returns "ef"

$rest = substr ("abcdef", -3, 1); // returns "d"

?

如果有给予参数 length而且是正数时,传回的字符串将会从 start传回 length个字元。

如果有给予参数 length而且是负数时,传回的字符串将会结束于 string结尾的第 length个字元。

Example :

?php

$rest = substr ("abcdef", 1, -1); // returns "bcde"

?

对于英文没有问题,我们测试一个中文

?php

$rest = substr ("中国人", 1, -1); // returns "fdsafsda" 就是乱码了

?

这种截取字符的结果,肯定不是我们想要的结果,这种出现PHP substr中文乱码的情况,可能会导致程序无法正常运行。解决办法主要有两种:

一、使用mbstring扩展库的mb_substr()截取就不会出现乱码了。

可以用mb_substr()/mb_strcut()这个函数,mb_substr()/mb_strcut()的用法与substr()相似,

只是在mb_substr()/mb_strcut最后要加入多一个参数,以设定字符串的编码,但是一般的服务器都没打开

php_mbstring.dll,需要在php.ini在把php_mbstring.dll打开。

?php

echo mb_substr("php中文字符encode",0,4,"utf-8");

?

如果未指定最后一个编码参数,会是三个字节为一个中文,这就是utf-8编码的特点,若加上utf-8字符集说明,所以,是以一个字为单位来截取的。

使用的时候要注意php文件的编码,和网页显示时的编码。使用这个mb_substr方法要事先知道字符串的编码,如果不知道编码,就需要判断,mbstring库还提供了mb_check_encoding来检验字符串编码,但还不完善。

PHP 自带几种字符串截取函数,其中常用到的就是 substr 和 mb_substr。前者在处理中文时,GBK 为 2 个长度单位,UTF 为 3 个长度单位,后者指定编码后,一个中文即为 1 个长度单位。

substr 有时会截 1/3 个中文或半个中文,会显示乱码,相对来说 mb_substr 更适合我们使用。不过有时候 mb_substr

就显得不那么好用了。例如我要显示一个小图片的简要信息,5 个中文正好,超过 5 个就截取前4再加上

”…”,这样处理中文是没问题了,可是处理英文或数字,这样截取就太短了。

二、自己书写截取函数,但效率不如用mbstring扩展库来得高。下面是ecshop里面的截取UTF-8编码下字符串的函数。

function sub_str($str, $length = , $append = true)

{

$str = trim($str);

$strlength = strlen($str);

if ($length == || $length = $strlength)

{

return $str; //截取长度等于或大于等于本字符串的长度,返回字符串本身

}

elseif ($length ) //如果截取长度为负数

{

$length = $strlength + $length;//那么截取长度就等于字符串长度减去截取长度

if ($length )

{

$length = $strlength;//如果截取长度的绝对值大于字符串本身长度,则截取长度取字符串本身的长度

}

}

if (function_exists('mb_substr'))

{

$newstr = mb_substr($str, , $length, EC_CHARSET);

}

elseif (function_exists('iconv_substr'))

{

$newstr = iconv_substr($str, , $length, EC_CHARSET);

}

else

{

//$newstr = trim_right(substr($str, , $length));

$newstr = substr($str, , $length);

}

if ($append $str != $newstr)

{

$newstr .= '...';

}

return $newstr;

}

同一个PHP文件中用substr_replace函数时出现乱码问题,用str_ireplace函数时正常,究竟问题出在哪儿了

需要从写 该函数

if($length strlen($string) $length) {

//截断字符

$wordscut = '';

if(strtolower($encoding) == 'utf-8') {

//utf8编码

$n = 0;

$tn = 0;

$noc = 0;

while ($n strlen($string)) {

$t = ord($string[$n]);

if($t == 9 || $t == 10 || (32 = $t $t = 126)) {

$tn = 1;

$n++;

$noc++;

} elseif(194 = $t $t = 223) {

$tn = 2;

$n += 2;

$noc += 2;

} elseif(224 = $t $t 239) {

$tn = 3;

$n += 3;

$noc += 2;

} elseif(240 = $t $t = 247) {

$tn = 4;

$n += 4;

$noc += 2;

} elseif(248 = $t $t = 251) {

$tn = 5;

$n += 5;

$noc += 2;

} elseif($t == 252 || $t == 253) {

$tn = 6;

$n += 6;

$noc += 2;

} else {

$n++;

}

if ($noc = $length) {

break;

}

}

if ($noc $length) {

$n -= $tn;

}

$wordscut = substr($string, 0, $n);

} else {

for($i = 0; $i $length - 1; $i++) {

if(ord($string[$i]) 127) {

$wordscut .= $string[$i].$string[$i + 1];

$i++;

} else {

$wordscut .= $string[$i];

}

}

}

$string = $wordscut;

}

return trim($string);

}

这个函数 就不会有乱码了