在PHP中有从多字节字符串中获取字符的简单方法吗?

在PHP中有从多字节字符串中获取字符的简单方法吗?,php,string,encoding,multibyte,Php,String,Encoding,Multibyte,这就是我的问题:我的语言(葡萄牙语)使用ISO-8859-1字符编码!当我想从像“coração”(心脏)这样的字符串中访问字符时,我使用: mb_内部编码('ISO-8859-1'); $str=“coração”; $len=mbstrlen($str,'UTF-8'); 对于($i=0;$i…排序。如果使用固定宽度编码(BMP中的ISO 8859-*、UCS-2或UTF-32或UTF-16),则可以使用固定乘法器进行字符访问。但仍需要对多字节编码进行多次访问 mb_substr函数的速度不

这就是我的问题:我的语言(葡萄牙语)使用ISO-8859-1字符编码!当我想从像“coração”(心脏)这样的字符串中访问字符时,我使用:

mb_内部编码('ISO-8859-1');
$str=“coração”;
$len=mbstrlen($str,'UTF-8');

对于($i=0;$i…排序。如果使用固定宽度编码(BMP中的ISO 8859-*、UCS-2或UTF-32或UTF-16),则可以使用固定乘法器进行字符访问。但仍需要对多字节编码进行多次访问

mb_substr函数的速度不如正常字符串访问中的[…]快:echo$str[$pos]…有可能吗

没有

多字节函数必须检查每个字符,以确定其占用的字节数(UTF-8中的1到4个字节)。因此,您立即知道字符索引(
$a[n]
)无法工作的原因:在读取第n个字符之前,您不知道需要获取第n个字符的字节数

要加快速度,您可以在此处查看答案:

但是,由于您使用ISO 8859-1或拉丁语-1,因此根本不必使用
mb
函数,因为在该编码中,所有字符都是。

请尝试:

preg_match_all( "/./u", $str, $ar_chars );
print_r( $ar_chars ); 

嗯……但我的问题是关于进行这些访问的有效方法。我测试了一个普通的字符串连接循环($new_str.=$old_str[2]——仅用于测试…),并使用mb_substr($new_str.=mb_substr($old_str,2,1,'UTF-8'),得到了这个结果(循环迭代50000次):0.016 s到正常访问,而4.98020911121674 s到mb_substr函数!这是一个很大的性能问题!使用固定宽度编码,您可以使用固定的乘数。那么我该怎么做呢?给我一个例子!
substr($ucs2string,$pos*2,2)
好吧……但是关于性能问题(就像我在测试中意识到的那样)?向上投票。基本上,提供的链接上的两个答案,以及如果您将mbstring.func_重载设置为7,则是您想要的。如果可用,它们基本上会进行索引,并且仅在必要时使用慢速mb_substr。在OP的示例中,只需要一次mb_substr。感谢您提供的有用链接和解释。5年后来,仍然是最相关的答案。 c o r a ç ã o
preg_match_all( "/./u", $str, $ar_chars );
print_r( $ar_chars );