[英]PHP: strpos & substr with UTF-8
假设我有一个长UTF-8编码的字符串。
并说我想检测此字符串中是否存在$var
。
假设$var
总是简单的字母或ascii字符的数字(例如"hello123"
)我不应该使用mb_strpos
或iconv_strpos
吗? 因为只要与其他功能一致,位置在字符方面是否正确无关紧要。
例:
$var='hello123';
$pos=strpos($utf8string,$var);
if ($pos!==false) $uptohere=substr($ut8string,0,$pos);
我是否正确,无论字符串是否包含花哨的UTF-8字符,上述代码都会将所有内容提取到'hello123'
? 我的逻辑是因为strpos
和substr
都会彼此一致(即使这一直是错误的),那么它仍然可以工作。
是的,你是对的。 关于角色本身没有歧义,即hello123
在UTF-8中不可能有任何其他东西。 你正在切片的方式,无论你是按字符切换还是按字节数切片都没关系。
所以是的,这是安全的, 只要你的字符串是UTF-8,从而与ASCII兼容 。
请看这里快速测试:http: //3v4l.org/XnM8s
为什么这样有效:
UTF-8中的字符串“汉字hello123”看起来像字节(我希望这能正确对齐):
e6 | bc | a2 | e5 | ad | 97 | 68 | 65 | 6c | 6c | 6f | 31 | 32 | 33
漢 | 字 | h | e | l | l | o | 1 | 2 | 3
strpos
将查找字节序列68656c6c6f313233
,返回6
作为“hello123”的起始字节。 substr
将从字节0
切出6个字节,返回“汉字”。 没有含糊之处。 您正在按字节查找和切片,无论有多少个字符都无关紧要。
您需要完全使用字符 ,在这种情况下,字符串函数必须能够识别编码。 或者你完全以字节为单位工作,在这种情况下,唯一的要求是字节不明确(比如“hello123”可以匹配BIG5中编码的“中国”,因为字节是相同的(它们不是,只是一个例子) )。 UTF-8是自同步的 ,这意味着没有这种模糊性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.