<?php
header(‘Content-Type:textml;charset=utf-8’);
$str=’我爱你,中国!我爱你,中国!我爱你,中国!’;

echo mb_substr($str,3,5,’UTF8′);

输出:
,涓浗锛佹垜

黑龙江网友:一个汉字不是一个字符
海南网友:

  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.     }

复制代码

湖北网友:

  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.     }

复制代码

宁夏网友:感觉是你环境的问题

为什么我用mb_substr函数截取字符串 乱码-LMLPHP
北京网友:把UTF-8去掉????

宁夏网友:
为什么我用mb_substr函数截取字符串 乱码-LMLPHP

你的问题不是mb_substr的问题,你注意看输出,第一个是逗号,说明没问题。出问题的是编码。

首先你声明编码的这一行有问题:

header(‘Content-Type:textml;charset=utf-8′);

应该是

header(‘Content-Type:text/html;charset=utf-8’);

其次,你检查一下你的文件的编码是不是utf-8,必须文件编码、response header编码都是 "utf-8"、浏览器没有强制指定其它编码。才能正常显示。
上海网友:https://3v4l.org/v93cL

给你放了一个线上的实时预览

01-17 12:28