我在处理另一个字符串(Haystack)内的两个字符Unicode字符串(针)的简单搜索时遇到了问题

问题的一部分是我不知道如何指定用于使用的代码 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?我的意思是在普斯外面?

$blah="\u56DE\u590D"; 不起作用?

感谢您的任何想法!

有帮助吗?

解决方案

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

也就是说,我将从结束开始:

$blah="\u56DE\u590D"; 不起作用?

否。该语言对Unicode一无所知。在PHP中,字符串是字节阵列。因此,您如何在PHP脚本中表达Unicode代码点取决于您要使用的编码。对于UTF-8,这将是 "\xE5\x9B\x9E\xE5\xA4\x8D", ,因为UTF-16 Big Endian会 "\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)中进行相同的工作需要更多的工作。

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

问题的一部分是我不知道如何指定用于使用的代码 strpos, ,我不知道是否必须对PHP进行编译,并对代码有任何特殊支持,或者我是否必须使用 mb_strpos 我试图避免的,因为它也可能无法使用。

你想做什么?为什么需要在字符串中找到位置? strpos 将为您提供给定字符串的字节偏移(再次以二进制形式解释)。您是否要夹住字符串? strpos (甚至 mb_strpos)在Unicode中的平均麻烦 - 字形可以由几个代码单元构成,因此您冒着剪裁一部分字形的风险。除非您告诉您要做什么,否则我无法向您提供更多建议。

其他提示

您写了“可能无法使用”。我建议你尝试 mb_strpos.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top