全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

IP归属甄别会员请立即修改密码
查看: 701|回复: 7
打印 上一主题 下一主题

为什么我用mb_substr函数截取字符串 乱码

[复制链接]
跳转到指定楼层
1#
发表于 2019-8-15 16:31:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
<?php
header('Content-Type:textml;charset=utf-8');
$str='我爱你,中国!我爱你,中国!我爱你,中国!';

echo mb_substr($str,3,5,'UTF8');

输出:
,涓浗锛佹垜
推荐
发表于 2019-8-15 17:33:34 | 只看该作者
本帖最后由 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"、浏览器没有强制指定其它编码。才能正常显示。
2#
发表于 2019-8-15 16:43:09 | 只看该作者
一个汉字不是一个字符
3#
发表于 2019-8-15 16:57:12 | 只看该作者
  1. /**
  2.      * 字符串截取,支持中文和其他编码
  3.      * @access public
  4.      * @param string $str 需要转换的字符串
  5.      * @param integer $start 开始位置
  6.      * @param string $length 截取长度
  7.      * @param string $charset 编码格式
  8.      * @param bool $suffix 截断显示字符
  9.      * @return string
  10.      */
  11.      function mSubStr($str, $start = 0, $length, $charset = "utf-8", $suffix = true) {
  12.         if (function_exists("mb_substr"))
  13.             $slice = mb_substr($str, $start, $length, $charset);
  14.         elseif (function_exists('iconv_substr')) {
  15.             $slice = iconv_substr($str, $start, $length, $charset);
  16.         } else {
  17.             $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
  18.             $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
  19.             $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
  20.             $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
  21.             preg_match_all($re[$charset], $str, $match);
  22.             $slice = join("", array_slice($match[0], $start, $length));
  23.         }

  24.         return $suffix ? $slice . '...' : $slice;
  25.     }
复制代码
4#
发表于 2019-8-15 16:59:35 | 只看该作者
本帖最后由 今晚我是你的 于 2019-8-15 17:00 编辑

  1. <?php  
  2. $str='我爱你,中国!我爱你,中国!我爱你,中国!';

  3. echo mSubStr($str,3,5,'utf-8');

  4. /**
  5.      * 字符串截取,支持中文和其他编码
  6.      * @access public
  7.      * @param string $str 需要转换的字符串
  8.      * @param integer $start 开始位置
  9.      * @param string $length 截取长度
  10.      * @param string $charset 编码格式
  11.      * @param bool $suffix 截断显示字符
  12.      * @return string
  13.      */
  14.      function mSubStr($str, $start = 0, $length, $charset = "utf-8", $suffix = true) {
  15.         if (function_exists("mb_substr"))
  16.             $slice = mb_substr($str, $start, $length, $charset);
  17.         elseif (function_exists('iconv_substr')) {
  18.             $slice = iconv_substr($str, $start, $length, $charset);
  19.         } else {
  20.             $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
  21.             $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
  22.             $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
  23.             $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
  24.             preg_match_all($re[$charset], $str, $match);
  25.             $slice = join("", array_slice($match[0], $start, $length));
  26.         }

  27.         return $suffix ? $slice . '...' : $slice;
  28.     }
复制代码
5#
发表于 2019-8-15 16:59:43 | 只看该作者
感觉是你环境的问题

6#
发表于 2019-8-15 17:10:56 | 只看该作者
把UTF-8去掉????

encoding        可选。字符编码。如果省略,则使用内部字符编码。
8#
发表于 2019-8-15 17:53:21 | 只看该作者
https://3v4l.org/v93cL

给你放了一个线上的实时预览
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2026-1-8 06:58 , Processed in 0.062503 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表