首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何检测或正确识别奇怪字符的长度?

我如何检测或正确识别奇怪字符的长度?
EN

Stack Overflow用户
提问于 2011-12-23 07:32:50
回答 1查看 413关注 0票数 0

我正在通过编程将软连字符插入到长词中,并且遇到异常字符的问题,特别是:

任何超过10个字符的单词都会得到软连字符的处理。单词定义为regex:[A-Za-z0-9,.]+ (包括长数字)。如果我用该正则表达式拆分包含上述unicode字符中的两个字符的字符串,就会得到一个'word‘,如下所示:

然后,我的脚本遍历每个单词,测量长度(mb_strlen($word, 'UTF-8')),如果它超过任意数量的字符,则遍历字母并在整个地方插入软连字符(每三个字符,而不是在最后五个字符中)。

有了这个词,单词的长度就会高到足以触发替换(10)。因此,插入软连字符,但它们插入字符。所以我得出的结论是:

代码语言:javascript
复制
�­�■

在数据库中,这些字符以"\u2002“的形式存储(在json_encoded块中),因此我可以看到字符串长度来自何处。我需要的是一种识别这些字符的方法,这样我就可以避免在包含这些字符的单词中添加软连字符。有什么主意吗有人吗?

(或者一种测量字符串长度的方法,将其计算为单个字符,然后将该字符串拆分为字符,而不通过多字节字符将其部分拆分。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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是您真正想要使用的唯一多字节编码。)

代码语言:javascript
复制
const SHY= "\xC2\cAD"; // U+00AD Soft Hyphen encoded as UTF-8
$wrappableword= preg_replace('/.{3}\B/u', '$1'.SHY, $longword);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8613394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档