PHP在字符串随机位置插入指定emoji符号代码失效如何解决
问题原因
代码无法正常工作的核心是PHP原生字符串函数默认按单字节计算长度、截取内容,而你使用的emoji是UTF-8编码的多字节字符,其中大量是带肤色修饰符、零宽连接符的组合emoji,单字节逻辑处理时会把一个完整emoji拆成多个独立字节片段,直接引发两个问题:
- 随机取字符时,大概率只取到某个emoji的部分字节,得到无法正常显示的乱码片段
- 计算插入位置、截取原字符串时,会出现位置偏移,甚至把原有多字节字符截坏产生乱码
修正方案
先确认环境已开启php_mbstring扩展(绝大多数PHP环境默认开启),将所有字符串操作替换为多字节安全的逻辑,完整可运行代码如下:
$string = "this is a string biggest string bigger than the string1 string"; // 按UTF-8字符数计算原字符串长度,而非字节数 $strTotalLength = mb_strlen($string, 'UTF-8'); // 随机位置覆盖从字符串开头到末尾的所有可插入点位 $random_position = rand(0, $strTotalLength); $chars = "👴🏿👩🏿💻🧑🏿🚀🧚🏿🤦🏿♀️👬🏿🚣🏿♂️✡️♈️🈯️🆗👩🏾❤️👩🏼🧑🏼❤️🧑🏻"; // 按Unicode规则拆分emoji字符串,保证组合emoji不会被拆碎 $emojiArray = preg_split('//u', $chars, -1, PREG_SPLIT_NO_EMPTY); // 从完整emoji数组中随机取一个元素 $random_char = $emojiArray[array_rand($emojiArray)]; // 按字符位截取原字符串拼接,不会截断多字节内容 $newString = mb_substr($string, 0, $random_position, 'UTF-8') . $random_char . mb_substr($string, $random_position, null, 'UTF-8'); echo $newString;
关键调整说明
- 长度计算、字符串截取全部替换为
mb_strlen、mb_substr多字节函数,手动指定UTF-8编码,按实际可见字符而非字节处理内容,从根源避免乱码 - 放弃用字符串下标直接取字符的写法,通过带
u修正符的正则拆分emoji字符串为独立完整的字符数组,哪怕是多段拼接的组合emoji也会被识别为单个元素,再通过array_rand随机取值,保证拿到的是完整可显示的emoji - 修正随机位置的取值范围,覆盖字符串末尾的插入点位,原逻辑的
strlen($string)-1会漏掉在字符串最后插入字符的合法场景
内容的提问来源于stack exchange,提问作者sahil mangukiya
相关产品推荐
相关产品推荐

