需求

如果需要将可能含有中文的字符串进行拆分成数组,我们下面以 utf-8 编码为例。

解决方案一

我习惯的方法可能是:mb_internal_encoding("UTF-8");

$str = "周梦康";

$array = [];

for ($i=0,$l = mb_strlen($str); $i < $l; $i++) {

array_push($array, mb_substr($str, $i, 1));

}

var_export($array);

假如我们没装mb扩展怎么办?

解决方案二

今天看到一份代码,别人是这么写的:/*

* 将可能含有中文的字符串进行拆分成数组

*/

function str_split_utf8($str)

{

$split = 1;

$array = array();

for ($i = 0; $i < strlen($str);) {

$value = ord($str[$i]);

if ($value > 127) {

if ($value >= 192 && $value <= 223) {

$split = 2;

} elseif ($value >= 224 && $value <= 239) {

$split = 3;

} elseif ($value >= 240 && $value <= 247) {

$split = 4;

}

} else {

$split = 1;

}

$key = null;

for ($j = 0; $j < $split; $j++, $i++) {

$key .= $str[$i];

}

array_push($array, $key);

}

return $array;

}

代码解读

strlen计算的是字节数,而直接使用$str[x]就沿用了c语言里面char数组和字符串的习惯,表示按字节来读取$str,也就是说每次读取的数据的ascii码值不可能大于255。而php里使用ord来获取ascii码值。

切割规则如下ascii 码范围切割偏移量0 ~ 1271 字节

192 ~ 2232 字节

224 ~ 2393 字节

240 ~ 2474 字节

为什么呢?

Unicode

Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。

UTF-8

UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式。UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8 的编码规则很简单,只有二条:对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的(能容纳0~127)。

对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。

下表总结了编码规则,字母x表示可用编码的位:Unicode 符号范围(十六进制)UTF-8 编码方式(二进制)UTF-8 首字节范围0000 0000-0000 007F0xxxxxxx0 ~ 127

0000 0080-0000 07FF110xxxxx 10xxxxxx(128+64) ~ (255-32) 也就是 192 ~ 223

0000 0800-0000 FFFF1110xxxx 10xxxxxx 10xxxxxx(128+64+32) ~ (255-16) 也就是 224 ~ 239

0001 0000-0010 FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx(128+64+32+16) ~ (255-8) 也就是 240 ~ 247

想必看了这个表,大家就能明白了吧。

php去掉多字节字符,PHP 面试题 - 如果没有 mb 系列函数,如何切割多字节字符串...相关推荐

  1. mbstowcs 和 wcstombs函数:C语言提供的宽字符和多字节字符转换函数

    C语言中的多字节字符与宽字符 字符型char只占八位,存储ascii码的,而宽字符型是为了存储多国语言的代码unicode,包括中文,法语德语什么的,8位256种不够用了 C语言原本是在英文环境中设计 ...

  2. linux 宽字符串,C语言中的多字节字符与宽字符

    C语言原本是在英文环境中设计的,主要的字符集是7位的ASCII码,8位的byte(字节)是最常见的字符编码单位.但是国际化软件必须能够表示不同的字符,而这些字符数量庞大,无法使用一个字节编码. C95 ...

  3. C语言中的多字节字符与宽字符

    C语言原本是在英文环境中设计的,主要的字符集是7位的ASCII码,8位的byte(字节)是最常见的字符编码单位.但是国际化软件必须能够表示不同的字符,而这些字符数量庞大,无法使用一个字节编码. C95 ...

  4. 通过编写串口助手工具学习MFC过程——(三)Unicode字符集的宽字符和多字节字符转换...

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  5. C语言中宽字符和多字节字符

    C 语言原本是在英文环境中设计的,主要的字符集是7 位的ASCII 码.从此开始,8 位的byte(字节)变成最常见的字符编码单位,但是国际化软件必须能够表示不同的字符,而这些字符数量庞大,无法使用一 ...

  6. 使用 _tprintf 宏兼容多字节字符集和Unicode字符集

    我们知道在windows平台上写C程序要考虑字符编码问题,为了兼容多字节字符集和Unicode,涉及字符,字符串操作,都要用TEXT宏围起来. 如果要使用printf,但是不确定字符集,可以使用 _t ...

  7. C/C++语言拾遗(三)-多字节字符和Unicode

    MFC字符集选项 MFC字符集选项 Unicode Character Set与Multi-Byte Character Set有什么区别呢? Multi-Byte Character Set一般是 ...

  8. Go 学习笔记(31)— 字符串 string、字符 rune、字节 byte、UTF-8 和 Unicode 区别以及获取字符串长度

    1. 字符串 string 类型 Go 语言中字符串的内部实现使用 UTF-8 编码,通过 rune 类型,可以方便地对每个 UTF-8 字符进行访问.当然, Go 语言也支持按照传统的 ASCII ...

  9. [分类整理IV]微软等100题系列V0.1版:字符串+数组面试题集锦

    微软等100题系列V1.0版整理IV:字符串+数组面试题集锦 July   2010年12月30日 第4章 字符串+数组面试题 在微软等100题系列V0.1版中,此类字符串+数组的问题,占了足足22道 ...

最新文章

  1. CCTextFieldTTF 与 5种常用CCMenuItem
  2. 不用代码,10分钟打造属于自己的第一款小程序
  3. POI文件导入:需求说明
  4. Swift基础--方法
  5. canoco5主成分分析步骤_R语言 PCA主成分分析
  6. 用Docker自动构建纸壳CMS
  7. 红帽7编译安装mysql_精通RHEL7编译安装mysql-5.5.32
  8. 中国人工智能论文首超美国,背后的秘密竟然是……
  9. 如何将MyEclipse开发的项目导入到Eclipse中运行
  10. Win10台式机前面板耳机无声音,没有Realtek高清晰音频管理器,前置耳机孔无法使用
  11. 通过VScode进行git的版本管理
  12. 项目管理课程体系——世纪德本PMCD品牌课程
  13. 【ppt课件制作】Focusky教程 | 如何设置内容全屏显示?
  14. ESN(Electronic Serial Number,电子序列号)简介
  15. 中国天网系统有多牛叉?BBC 记者体验了一把
  16. 医学计算机论文,医学图像数据库-外文翻译(计算机论文,医学论文适合)
  17. 特效制作软件AE(After Effects)插件安装
  18. Python中NaN、nan和NAN的区别及使用方法
  19. ZUCC_Linux系统管理_实验五 计划任务
  20. 对接医疗资源,创建高质量医疗数据库,这家公司能降低跨境医疗费用吗?

热门文章

  1. c语言时钟报告,C语言图形时钟课程设计实验报告
  2. PHP开发自己的框架必备知识点
  3. 清除谷歌浏览器的dns缓存
  4. iis管理常用命令 创建IIS站点 应用应用程序 及虚拟目录
  5. 推荐一简单易用的脑图制作工具
  6. ArcGIS实验教程——实验二十一:DEM分析
  7. Android Studio开发基础之动态注册与注销BroadcastReceiver
  8. C语言试题六之使字符串的前导*号不得多于n个;若多于n个,则删除多于的*号;若少于或等于n个,则什么也不做。字符串中间和尾部的*号不删除。
  9. java之socket的OOBInline和UrgentData和发送心跳包研究
  10. 关于在Windows下AndroidStudio.使用React-Native开发android报错红屏“run react-native start”解决