【发布时间】:2025-12-16 13:35:01
【问题描述】:
如何使用索引逐个字符地迭代 UTF-8 字符串?
当您使用括号运算符 $str[0] 访问 UTF-8 字符串时,utf 编码的字符由 2 个或更多元素组成。
例如:
$str = "Kąt";
$str[0] = "K";
$str[1] = "�";
$str[2] = "�";
$str[3] = "t";
但我想要:
$str[0] = "K";
$str[1] = "ą";
$str[2] = "t";
mb_substr 是可能的,但这非常慢,即。
mb_substr($str, 0, 1) = "K"
mb_substr($str, 1, 1) = "ą"
mb_substr($str, 2, 1) = "t"
是否有另一种方法可以在不使用mb_substr 的情况下逐个字符地对字符串进行交互?
【问题讨论】:
-
定义“极慢”。您是否分析过您的应用程序并发现这些 mb_substr 调用是某个瓶颈?
-
第二次阅读您的问题后,我意识到您想要一种无需 mb_substr 的方法。我已经删除了我的答案。
-
@Col。弹片:是的,50% 的处理时间是由
mb_substr完成的。 -
50% 什么处理?整个用户对网络服务器的请求,从连接到断开?我不敢相信。您的整个脚本在每个请求上都以相同的方式解析。没有人注意到这一点。您的 mb 解析占用了整个请求时间的哪一部分?
-
我很惊讶没有其他人建议这样做,但是如果您想要最快的解决方案,并且可以忍受高达 4 倍的字符串内存开销,converting to UTF-32 将为您提供固定宽度的字符每个 4 个字节 - 如果您需要随机访问字符串中的任何字符,这可能是最有效的解决方案,除非您正在处理非常大的文件,否则内存开销可能是可以接受的。