4

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

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

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

例子:

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

我是否正确,'hello123'无论字符串是否包含花哨的 UTF-8 字符,上述代码都会提取所有内容?我的逻辑是,因为两者都strpossubstr相互一致(即使这一直是错误的),所以它应该仍然有效。

4

2 回答 2

10

是的,你是对的。字符本身没有歧义,即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将查找字节序列68656c6c6f3132336作为“hello123”的起始字节返回。substr将从 byte 中切出 6 个字节0,返回“汉字”。没有歧义。您正在按字节查找和切片,不管有多少字符。

您需要完全在characters中工作,在这种情况下,字符串函数必须是编码感知的。或者您完全在bytes中工作,在这种情况下,唯一的要求是字节不模棱两可(比如“hello123”可以匹配以 BIG5 编码的“中国”,因为字节是相同的(它们不一样,只是一个例子) )。UTF-8 是自同步的,这意味着没有这种歧义。

于 2013-02-24T10:24:30.027 回答
3

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

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

mb_substr()

于 2013-02-24T10:21:20.237 回答