繁体   English   中英

PHP:使用UTF-8的strpos和substr

[英]PHP: strpos & substr with UTF-8

假设我有一个长UTF-8编码的字符串。

并说我想检测此字符串中是否存在$var

假设$var总是简单的字母或ascii字符的数字(例如"hello123" )我不应该使用mb_strposiconv_strpos吗? 因为只要与其他功能一致,位置在字符方面是否正确无关紧要。

例:

$var='hello123';
$pos=strpos($utf8string,$var);
if ($pos!==false) $uptohere=substr($ut8string,0,$pos);

我是否正确,无论字符串是否包含花哨的UTF-8字符,上述代码都会将所有内容提取到'hello123' 我的逻辑是因为strpossubstr都会彼此一致(即使这一直是错误的),那么它仍然可以工作。

是的,你是对的。 关于角色本身没有歧义,即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是自同步的 ,这意味着没有这种模糊性。

在UTF-8中,您必须使用mb_ *函数,在您需要将substr替换为

mb_substr($var, 0, N, 'UTF-8');

mb_substr()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM