将字符串转换为字符数组-多字节 [英] Convert a String into an Array of Characters - multi-byte

查看:72
本文介绍了将字符串转换为字符数组-多字节的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设在2019年,所有非Unicode安全的解决方案都是错误的。在PHP中将字符串转换为Unicode字符数组的最佳方式是什么?

显然,这意味着使用花括号语法访问字节以及使用str_split

是错误的
$arr = str_split($text);

来自如下示例输入:

$string = '先éé€𐍈💩👩‍ 👩‍❤️‍👩';

我期望:

array(16) {


[0]=>
  string(3) "先"
  [1]=>
  string(2) "é"
  [2]=>
  string(1) "e"
  [3]=>
  string(2) "́"
  [4]=>
  string(3) "€"
  [5]=>
  string(4) "𐍈"
  [6]=>
  string(4) "💩"
  [7]=>
  string(4) "👩"
  [8]=>
  string(3) "‍"
  [9]=>
  string(1) " "
  [10]=>
  string(4) "👩"
  [11]=>
  string(3) "‍"
  [12]=>
  string(3) "❤"
  [13]=>
  string(3) "️"
  [14]=>
  string(3) "‍"
  [15]=>
  string(4) "👩"
}

推荐答案

只传递一个带有PREG_SPLIT_NO_EMPTY标志的空模式。 否则,您可以使用X(Unicode点)和K(重新启动全字符串匹配)编写模式。我将包括一个mb_split()调用和一个preg_match_all()调用以确保完整性。

编码:(Demo)

$string='先秦兩漢';
var_export(preg_split('~~u', $string, 0, PREG_SPLIT_NO_EMPTY));
echo "
---
";
var_export(preg_split('~XK~u', $string, 0, PREG_SPLIT_NO_EMPTY));
echo "
---
";
var_export(preg_split('~XK(?!$)~u', $string));
echo "
---
";
var_export(mb_split('XK(?!$)', $string));
echo "
---
";
var_export(preg_match_all('~X~u', $string, $out) ? $out[0] : []);

所有产品::

array (
  0 => '先',
  1 => '秦',
  2 => '兩',
  3 => '漢',
)

发件人https://www.regular-expressions.info/unicode.html

如何匹配单个Unicode字形

在Perl、PCRE、PHP、Boost、Ruby 2.0、Java 9和Just Great Software应用程序中,只需使用X即可轻松匹配单个字素,无论它是编码为单个代码点还是使用组合标记为多个代码点。

您可以认为X是点的Unicode版本。但有一个区别:X始终匹配换行符,而点不匹配换行符,除非您启用点匹配换行符模式。


更新,DHarman提醒我mb_str_split()现已从PHP7.4开始提供。

new函数的默认长度参数为1,因此在这种情况下可以省略长度参数。

https://wiki.php.net/rfc/mb_str_split

达曼演示:https://3v4l.org/M85Fi/rfc#output

这篇关于将字符串转换为字符数组-多字节的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆