我正在尝试在ColdFusion中规范化一个字符串。
我想使用Java类java.text.Normalizer
来实现这一点,因为据我所知,CF没有任何类似的函数。
下面是我的当前代码:
<cfset normalizer = createObject( "java", "java.text.Normalizer" ) />
<cfset string = "äéöè" />
<cfset string = normalizer.normalize(string, createObject( "java", "java.text.Normalizer$Form" ).NFD) />
<cfset string = ReReplace(string, "\\p{InCombiningDiacriticalMarks}+", "") />
<cfoutput>#string#</cfoutput>
为什么它总是输出äéöè
而不是一个规范化的字符串?
3条答案
按热度按时间xdnvmnnf1#
与Java不同,在ColdFusion中,不需要转义字符串中的反斜杠。您当前的正则表达式将不匹配任何不以反斜杠开头的内容,因此不会发生替换。
除此之外,您的代码是完全正确的,您可以看到在输出时字符串的长度是8,而不是4。这是
normalize
调用的结果。但是,请记住,它仍然是原始字符串的等效表示,因此您无法从视觉上区分两者的区别并不奇怪。这是正确的Unicode渲染。
6yjfywim2#
您的
"\\p"
应该只是"\p"
。Cf的ReReReplace()会自动转义反斜杠,因此"\\p"
在java端被解释为"\\\\p"
一个内衬:
http://www.cfquickdocs.com/cf9/#rereplace
(Edit:cfquickdocs链接已断开。域名注册已过期)
vdzxcuhz3#
我推荐使用像Junidecode这样的Java库。https://github.com/gcardone/junidecode
它将UTF8和UTF16字符串转换为ASCII7。示例:
我已经分享了一个完整的基于ColdFusion的演示(需要Junidecode JAR文件):https://dev.to/gamesover/convert-unicode-strings-to-ascii-with-coldfusion-junidecode-lhf
下面是代码函数: