全球主机交流论坛
标题:
为什么我用mb_substr函数截取字符串 乱码
[打印本页]
作者:
yjsx86
时间:
2019-8-15 16:31
标题:
为什么我用mb_substr函数截取字符串 乱码
<?php
header('Content-Type:textml;charset=utf-8');
$str='我爱你,中国!我爱你,中国!我爱你,中国!';
echo mb_substr($str,3,5,'UTF8');
输出:
,涓浗锛佹垜
作者:
Dect
时间:
2019-8-15 16:43
一个汉字不是一个字符
作者:
胖胖猪
时间:
2019-8-15 16:57
/**
* 字符串截取,支持中文和其他编码
* @access public
* @param string $str 需要转换的字符串
* @param integer $start 开始位置
* @param string $length 截取长度
* @param string $charset 编码格式
* @param bool $suffix 截断显示字符
* @return string
*/
function mSubStr($str, $start = 0, $length, $charset = "utf-8", $suffix = true) {
if (function_exists("mb_substr"))
$slice = mb_substr($str, $start, $length, $charset);
elseif (function_exists('iconv_substr')) {
$slice = iconv_substr($str, $start, $length, $charset);
} else {
$re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
$re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
$re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
$re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
preg_match_all($re[$charset], $str, $match);
$slice = join("", array_slice($match[0], $start, $length));
}
return $suffix ? $slice . '...' : $slice;
}
复制代码
作者:
今晚我是你的
时间:
2019-8-15 16:59
本帖最后由 今晚我是你的 于 2019-8-15 17:00 编辑
胖胖猪 发表于 2019-8-15 16:57
<?php
$str='我爱你,中国!我爱你,中国!我爱你,中国!';
echo mSubStr($str,3,5,'utf-8');
/**
* 字符串截取,支持中文和其他编码
* @access public
* @param string $str 需要转换的字符串
* @param integer $start 开始位置
* @param string $length 截取长度
* @param string $charset 编码格式
* @param bool $suffix 截断显示字符
* @return string
*/
function mSubStr($str, $start = 0, $length, $charset = "utf-8", $suffix = true) {
if (function_exists("mb_substr"))
$slice = mb_substr($str, $start, $length, $charset);
elseif (function_exists('iconv_substr')) {
$slice = iconv_substr($str, $start, $length, $charset);
} else {
$re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
$re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
$re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
$re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
preg_match_all($re[$charset], $str, $match);
$slice = join("", array_slice($match[0], $start, $length));
}
return $suffix ? $slice . '...' : $slice;
}
复制代码
作者:
wkdhf233
时间:
2019-8-15 16:59
感觉是你环境的问题
作者:
逸笙
时间:
2019-8-15 17:10
把UTF-8去掉????
encoding 可选。字符编码。如果省略,则使用内部字符编码。
作者:
dvbhack
时间:
2019-8-15 17:33
本帖最后由 dvbhack 于 2019-8-15 17:41 编辑
你的问题不是mb_substr的问题,你注意看输出,第一个是逗号,说明没问题。出问题的是编码。
首先你声明编码的这一行有问题:
header('Content-Type:
textml
;charset=utf-8');
应该是
header('Content-Type:text/html;charset=utf-8');
其次,你
检查一下你的文件的编码是不是utf-8
,必须文件编码、response header编码都是 "utf-8"、浏览器没有强制指定其它编码。才能正常显示。
作者:
dvbhack
时间:
2019-8-15 17:53
https://3v4l.org/v93cL
给你放了一个线上的实时预览
欢迎光临 全球主机交流论坛 (https://loc.516000.xyz/)
Powered by Discuz! X3.4