php如何通过字节长度分隔字符串?达到无乱码的效果。

编码为utf8(一个汉字3字节,一个英文1字节)
例:

  1. 一段文字:“我爱北京天安门”,我想从第12个字节的位置分隔,则字符串分割为:“我爱北京”,“天安门”,结果正确。
  2. 若一段文字为:“i爱北京天安门”,我想从第12个字节的位置分隔,则字符串分割为:“i爱北京??”,“??安门”,结果错误,有乱码。

我想达到的效果是,若碰到按字节无法分隔的字符,则向前移动到无乱码的情况。例如按12个字节分隔会出乱码,则尝试按11个字节分隔,若还出乱码则尝试按10个字节分隔,直到无乱码为止。

注:不能使用mb_xxx类函数直接按字符分割分隔,因为不符合需求,本需求是按字节分隔。

阅读 3.1k
2 个回答

首先应该判断字节是否是 utf-8 的开头字节

  1. 从 byte[] 数组中获取一个 byte 并将它转换成无符号类型的 int 变量 value
  2. 判断 value 是否是 ASCII 字符(小于 0x80)
  3. 判断 value 是否是无效字符(大于 0x80,小于 0xC0,参照 UTF8 编码规则)
  4. 确认该字符编码的是几字节 UTF8
  5. 确认该字符编码的除第一个字节外的字节是否满足 10xxxxxx 格式

参考,PHP 同理

还是用mb_substr()吧
你要截12个字节的话,就用mb_substr先截取4个字符,然后用strlen判断这4个字符的字节数,不足12就保留本次记录后再多截一个字符,大于12的话就少截一个字符,循环依次判断

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题