我正在通过编程将软连字符插入到长词中,并且遇到异常字符的问题,特别是:
任何超过10个字符的单词都会得到软连字符的处理。单词定义为regex:[A-Za-z0-9,.]+ (包括长数字)。如果我用该正则表达式拆分包含上述unicode字符中的两个字符的字符串,就会得到一个'word‘,如下所示:
然后,我的脚本遍历每个单词,测量长度(mb_strlen($word, 'UTF-8')),如果它超过任意数量的字符,则遍历字母并在整个地方插入软连字符(每三个字符,而不是在最后五个字符中)。
有了这个词,单词的长度就会高到足以触发替换(10)。因此,插入软连字符,但它们插入字符。所以我得出的结论是:
�­�■在数据库中,这些字符以"\u2002“的形式存储(在json_encoded块中),因此我可以看到字符串长度来自何处。我需要的是一种识别这些字符的方法,这样我就可以避免在包含这些字符的单词中添加软连字符。有什么主意吗有人吗?
(或者一种测量字符串长度的方法,将其计算为单个字符,然后将该字符串拆分为字符,而不通过多字节字符将其部分拆分。)
发布于 2011-12-23 14:09:35
在没有看到代码的情况下,在关于猜测的注释中列出了相同的警告:
mb_strlen($word, 'UTF-8'),如果它超过任意数目的字符,则遍历这些字母
我怀疑你实际上是在遍历字节。如果在字符串上使用数组访问表示法,就会发生这种情况。
当您使用像UTF-8这样的多字节编码时,一个字母(或更一般的“字符”)可能占用多个字节的存储空间。如果在字节序列中间插入或删除,则会得到损坏的结果。
这就是为什么您必须使用mb_strlen而不是普通的旧strlen。有些语言有一个本机Unicode字符串类型,其中每个项都是一个字符,但是在PHP中,字符串完全基于字节,如果您想以逐字符的方式与它们交互,则必须使用字符串函数。特别地,要从字符串中读取单个字符,可以使用mb_substr,并将索引从0循环到mb_strlen。
如果取匹配的单词并使用正则表达式替换,在每个序列之间插入软连字符可能会更简单。您可以使用u标志获得regex的多字节字符串支持。(这只适用于UTF-8,但UTF-8是您真正想要使用的唯一多字节编码。)
const SHY= "\xC2\cAD"; // U+00AD Soft Hyphen encoded as UTF-8
$wrappableword= preg_replace('/.{3}\B/u', '$1'.SHY, $longword);https://stackoverflow.com/questions/8613394
复制相似问题