瞎扯淡 关于中英文自动隔开的算法实现

huacnlee · 2012年03月28日 · 最后由 huacnlee 回复于 2014年05月11日 · 5211 次阅读

这个想法来至于:《爽!網頁的中文與英、數字、符號間,終於自動加空白了》 其实我也一直有这样的想法,很多人发帖的时候没有注意中文和英文之间的空格,而排出来不够好看,比如

浏览器里面Chrome是不是比Firefox快?


这样会是不是更好?

浏览器里面 Chrome 是不是比 Firefox 快?


还有字母大小写的问题。 不知道有没有什么靠谱的办法在在应用上面就自动处理掉,服务端的也好,JS 的也好。

这里有这个项目:https://github.com/gibuloto/paranoid-auto-spacing

演示效果用 Chrome 安装 https://chrome.google.com/webstore/detail/paphcfdffjnbcgkokihcdjliihicmbpd 这个插件就能看到效果。

源码中的实现方式:

function insert_space(text) {
    // 英文、數字、符號 ([a-z0-9~!@#&;=_\$\%\^\*\-\+\,\.\/(\\)\?\:\'\"\[\]\(\)])

    // 中文在前
    text = text.replace(/([\u4E00-\u9FA5])([a-z0-9@#&;=_\[\$\%\^\*\-\+\(\/])/ig, '$1 $2');

    // 中文在後
    text = text.replace(/([a-z0-9#!~&;=_\]\,\.\:\?\$\%\^\*\-\+\)\/])([\u4E00-\u9FA5])/ig, '$1 $2');

    // 考慮增加 - + / * 前後的空白

    return text;
}

目前 paranoid-auto-spacing 这个是有 Bug 存在的,某些场景下面不需要空格。 比如:

2012年12月开始新的历程


2000万的用户,其中有200人是....


其实一直一来,我都在人肉帮大家修标题和正文里面空格的问题...

漢學家稱這個空白字元為「盤古之白」,因為它劈開了全形字和半形字之間的混沌。另有研究顯示,打字的時候不喜歡在中文和英文之間加空格的人,感情路都走得很辛苦,有七成的比例會在 34 歲的時候跟自己不愛的人結婚,而其餘三成的人最後只能把遺產留給自己的貓。畢竟愛情跟書寫都需要適時地留白。 这。。。

ruby 1.9.3, need more unit test

string = "浏览器里面Chrome是不是比Firefox快?"
string.scan(/([^[[:ascii:]]]*)([[:ascii:]]*)([^[[:ascii:]]]*)/).flatten.map(&:strip).reject(&:empty?).join(" ")
 => "浏览器里面 Chrome 是不是比 Firefox 快?"


@quakewang cool

string = "浏览器里面Chrome是不是比Firefox快?2012年12月开始新的历程,2000万的用户,其中有200人是...."
string.scan(/([^[[a-zA-Z]]]*)([[a-zA-Z]]+)([^[[a-zA-Z]]]*)/).flatten.map(&:strip).reject(&:empty?).join(" ")
#=> "浏览器里面 Chrome 是不是比 Firefox 快?2012年12月开始新的历程,2000万的用户,其中有200人是...."

ruby 1.9.3, need more unit test

at 中英文混合昵称时候要避免误解析

没这么简单,还有数字,日期那种场景

#8 楼 @huacnlee 理论上规则确定了就可以实现。这个问题的难度是规则不确定...

或许可以看看这个贴子中的扩展的实现: http://www.v2ex.com/t/30705

#2 楼 @huacnlee 我也发现了这个问题,给 guides 翻译问题一旦中英文混起来就相当的丑,我觉得可能也和字体有关系,因为中英文是不等高的,混在一起显得很混乱

#9 楼 @hooopo

我觉得 hooopo 说的很对,难点不在于编写正则表达式,在于确定规则。

#5 楼 @quakewang #6 楼 @saberma

我觉得你们实现都有个前提:非要把复杂的逻辑通过一个`正则'来实现,为什么不能单独实现呢?

#8 楼 @huacnlee 华顺,我给个不错的建议,你可以通过执行多次 gsub 操作,然后把他们串成一串,就类似于设计模式中的组合模式一样,没必要一次就非要把最复杂的逻辑搞定吧...

我下面给个 shell 下的脚本实现,仅作参考:

command ruby -ip \
-e 'gsub(/([a-zA-Z])(?=\p{han})/, "\\1 ")' \    # => 如果汉字前面是英文, 在汉字前面加空格.
-e 'gsub(/(?<=\p{han})([a-zA-Z])/, " \\1")' \   # => 如果汉字后面是英文, 在汉字后面加空格.
"$@"        

只要你制定出规则,你可以通过-e 添加任意多的逻辑。对吧?

匿名 #13 2012年05月16日

其实归根结底还是用户体验的问题吧。 个人感觉长短英文空格,单个单词粗体看着比较舒服 浏览器里面Chrome是不是比Firefox快?

@zw963 尝试的写了一下分割的算法,用在 Rails Guides 的翻译上,分割 中英文边界,感觉不太容易,关键是非常容易把原本不该加的加上了空格,把布局搞乱。 @huacnlee 改动了几次,发现似乎只要中英文混搭,加不加空格都会把整个页面给弄乱,这里我已经把英文换了一个字体显示了。 不知道有没有前端的经验传授一下。 预览一段比较明显的:

#2 楼 @huacnlee 在日期和數字之間加空格,這不是 bug,這是 feature 哈哈哈! 我覺得不管在任何情況下,只要中英文、數字夾雜,就應該加空格。

今天发现 36kr 的评论实现了,不知道他们是怎么做的

需要 登录 后方可回复, 如果你还没有账号请 注册新账号