ColdFusion中移除翻译文本重音符号的问题排查
问题解决:ColdFusion清理Google翻译文本重音符号无效的问题
核心原因
Google Translate返回的文本中,重音字符大概率是组合Unicode字符(比如ó是由基础字符o+单独的重音标记\u0301组成),而非单个预合成的重音字符(比如\u00F3)。你之前写的正则只匹配了预合成的重音字符,自然无法命中;CONTAINS匹配不到也是同样的原因。
解决方案
1. 先做Unicode归一化
使用ColdFusion的normalize()函数,将组合字符转换为预合成字符,这样原有的正则就能正常匹配了:
<cfset normalizedTrans = normalize(trans, "NFC")>
参数NFC表示把字符转换为标准合成形式,合并组合字符为单个预合成字符。
2. 优化重音替换代码
归一化后,你可以保留原有的替换逻辑,也可以合并正则提高效率:
<cfset trans_sms = REReplace(normalizedTrans, "[À-Åà-å]", "a", "all")> <cfset trans_sms = REReplace(trans_sms, "[È-Ëè-ë]", "e", "all")> <cfset trans_sms = REReplace(trans_sms, "[Ì-Ïì-ï]", "i", "all")> <cfset trans_sms = REReplace(trans_sms, "[Ò-Øò-ø]", "o", "all")> <cfset trans_sms = REReplace(trans_sms, "[Ù-Üù-ü]", "u", "all")> <cfset trans_sms = REReplace(trans_sms, "[çÇ]", "c", "all")> <cfset trans_sms = REReplace(trans_sms, "[ñÑ]", "n", "all")>
3. 更简洁的重音移除方法(CF10+支持)
如果你的ColdFusion版本在10及以上,可以直接用Unicode属性正则,一次性移除所有重音标记(不管是组合还是预合成字符):
<cfset trans_sms = REReplace(trans, "\p{Mn}", "", "all")>
\p{Mn}匹配所有非间距标记(各类重音、声调符号),执行后直接保留基础字母。
4. 验证CONTAINS匹配
归一化后,CONTAINS就能正常识别带重音的词汇了:
<cfset normalizedTrans = normalize(trans, "NFC")> <cfif normalizedTrans CONTAINS 'ignórela'>It was found within SMS</cfif>
内容的提问来源于stack exchange,提问作者Scott Dettling
相关产品推荐
相关产品推荐

