【发布时间】:2011-12-23 07:32:50
【问题描述】:
我正在以编程方式将软连字符插入长单词中,并且遇到了异常字符的问题,特别是: ■
任何超过 10 个字符的单词都会得到软连字符处理。单词用正则表达式定义:[A-Za-z0-9,.]+(包括长数字)。如果我用该正则表达式拆分包含上述两个 unicode 字符的字符串,我会得到一个像这样的“单词”: ■■
然后我的脚本遍历每个单词,测量长度 (mb_strlen($word, 'UTF-8')),如果超过任意数量的字符,则循环遍历字母并在整个位置插入软连字符(每隔三个字符,而不是最后五个字符)。
使用■■,字长足以触发替换 (10)。所以软连字符被插入,但它们被插入内字符。所以我得到的是这样的:
�­�■
在数据库中,这些 ■ 字符被存储(在 json_encoded 块中)为“\u2002”,因此我可以看到字符串长度的来源。我需要的是一种识别这些字符的方法,这样我就可以避免在包含它们的单词中添加软连字符。有什么想法吗?
(要么是这样,要么是测量字符串长度的方法,将它们计为单个字符,然后将字符串拆分为字符,而不是通过多字节字符中途拆分。)
【问题讨论】:
-
所以您将处理应用于
json_encoded 文本而不是“真正的”UTF-8 文本?如果是这样,为什么不首先json_decode文本,然后应用您的处理,然后再次json_encode处理的文本?因为mb_strlen("■■", 'UTF-8')应该返回正确的字符长度:2。 -
据我了解,正则表达式可能存在多字节编码问题。
-
Dr.Molle:我把这个词当作一个数组,循环遍历这些字母。每三分之一,我添加一个连字符。
-
vstm:处理应用于解码的文本。但你是对的 - 我只是像你一样对内容进行了手动测试,
mb_strlen的长度是正确的。也许还有其他问题。 -
我认为您需要发布一些代码。我看不到 \u2002 (U+2002 EN SPACE) 如何匹配正则表达式,我看不到它如何转换为 U+25A= BLACK SQUARE “■”,更不用说在字符内插入什么字符可能意味着。我也看不出在每三个字母后任意插入软连字符的意义——这在我所知道的任何语言中都是不正确的。