我在处理简单搜索另一个字符串(干草堆)中的两个字符 unicode 字符串(针)时遇到问题,该字符串可能是也可能不是 UTF-8
部分问题是我不知道如何指定在 strpos
中使用的代码,并且我不知道 PHP 是否必须在对代码的任何特殊支持的情况下进行编译,或者如果我必须使用我试图避免的 mb_strpos
,因为它也可能不可用。
即。例如针是U+56DE U+590D
(没有空格)
使用 preg_match 可能是 preg_match("@\x{56DE}\x{590D}@",$haystack)
但这实际上需要 @u
,它可能不可用,并且我得到一个 Compilation failed: character value in\x{...}equence is太大
无论如何。 p>
无论如何我都不想使用 preg_match,因为它可能比 strpos 慢得多(还有其他序列需要搜索)。
我可以将 U+56DE U+590D
转换为其单字节序列(可能是 5-6 个字符),然后通过 strpos 搜索它吗?我不能如果是的话,弄清楚如何将其转换为字节。
如何在 PHP 中指定内联 unicode?我的意思是在 PRCE 之外?
$blah="\u56DE\u590D";
不起作用?
感谢您的任何想法!
最佳答案
首先,你的问题结构很糟糕。它在几个点上有几个问题。如果您使用更清晰的结构,您可能会得到更多答案:1)描述您想要完成的任务,2)限制/要求,3)您考虑的策略,4)您发现这种策略的困难/有没有更好的。
也就是说,我将从最后开始:
$blah="\u56DE\u590D";
doesn't work?
没有。该语言对 unicode 一无所知。在 PHP 中,字符串是字节数组。因此,如何在 PHP 脚本中表达 unicode 代码点取决于您要使用的编码。对于 UTF-8,它将是 "\xE5\x9B\x9E\xE5\xA4\x8D"
,对于 UTF-16 大端字节序将是 "\x56\xDE\x59\x0D"
,等等。
Can I convert
U+56DE U+590D
into its single byte sequence (possibly 5-6 characters) and then search for it viastrpos
? I can't figure out how to convert it to bytes if so.
对于第一部分,是的,即转换 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)中执行相同操作则需要更多工作。
对于第二部分,请继续阅读。
Part of the problem is I don't know how to specify the code for use in
strpos
, and I don't know if PHP has to be compiled with any special support for the code, or if I have to usemb_strpos
which I am trying to avoid since it also might not be available.
你想做什么?为什么需要查找字符串中的位置? strpos
将为您提供给定字符串的字节偏移量(同样以二进制形式解释)。你想剪断一根绳子吗? strpos
(甚至 mb_strpos
)在 Unicode 中意味着麻烦 - 一个字形可以由多个代码单元构成,因此您可能会冒着剪切部分字形的风险。除非你说出你想做什么,否则我无法给你更多建议。
关于php - strpos 在 PHP 中搜索 unicode(并处理内联 UTF-8),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3545807/