2

我在处理可能是也可能不是 UTF-8 的另一个字符串(干草堆)中简单搜索两个字符的 unicode 字符串(针)时遇到问题

部分问题是我不知道如何指定用于 in 的代码strpos,并且我不知道 PHP 是否必须在对代码的任何特殊支持的情况下进行编译,或者我是否必须使用mb_strpos我正在尝试的避免,因为它也可能不可用。

IE。例如针是 U+56DE U+590D(没有空格)

使用 preg_match 可能是preg_match("@\x{56DE}\x{590D}@",$haystack) 但实际上需要@u的可能不可用,Compilation failed: character value in \x{...} sequence is too large无论如何我得到了。

我不想使用 preg_match ,因为它可能比 strpos 慢得多(还有其他序列需要搜索)。

我可以转换U+56DE U+590D成它的单字节序列(可能是 5-6 个字符),然后通过 strpos 搜索它吗?如果是这样,我不知道如何将其转换为字节。

无论如何,您如何在 PHP 中指定 unicode 内联?我的意思是在PRCE之外?

$blah="\u56DE\u590D"; 不工作?

感谢您的任何想法!

4

2 回答 2

3

首先,您的问题结构不佳。它在几个方面有几个问题。如果您使用更清晰的结构,您可能会得到更多答案:1)描述您要完成的任务,2)限制/要求,3)您考虑的策略,4)您发现的困难与这种策略/有没有更好的。

也就是说,我将从最后开始:

$blah="\u56DE\u590D";不工作?

不,该语言对 unicode 一无所知。在 PHP 中,字符串是字节数组。因此,如何在 PHP 脚本中表达 unicode 代码点取决于您要使用的编码。对于 UTF-8,它将是"\xE5\x9B\x9E\xE5\xA4\x8D",对于 UTF-16,大端将是"\x56\xDE\x59\x0D",依此类推。

我可以转换U+56DE U+590D成它的单字节序列(可能是 5-6 个字符)然后通过 搜索它strpos吗?如果是这样,我不知道如何将其转换为字节。

对于第一部分,是的,即转换U+56DE U+590D为字节,需要澄清。这些是 UTF-16 代码单元还是 Unicode 代码点?例如,如何表示?U+D869 U+uDED6还是U+2A6D6?如果它们是 unicode 代码单元,则将它们编码为 UTF-16 很简单。对于 UTF-16 大端,它只是"\x56\xDE\x59\x0D". 否则,将它们编码为 UTF-32 仍然是微不足道的,但在 UTF-16(或 UTF-8)中做同样的事情需要更多的工作。

对于第二部分,请继续阅读。

部分问题是我不知道如何指定用于 in 的代码strpos,并且我不知道 PHP 是否必须在对代码的任何特殊支持的情况下进行编译,或者我是否必须使用mb_strpos我正在尝试的避免,因为它也可能不可用。

你想做什么?为什么需要在字符串中查找位置?strpos将为您提供给定字符串的字节偏移量(同样,以二进制形式解释)。你想剪断一个字符串吗?strpos(甚至mb_strpos)在 Unicode 中意味着麻烦——一个字形可以由多个代码单元构成,因此您可能会剪掉一个字形的一部分。除非您说出您要做什么,否则我无法为您提供更多建议。

于 2010-08-23T19:47:42.577 回答
1

你写了“可能不可用”。我建议您尝试mb_strpos

于 2010-08-23T08:26:16.070 回答