2012-07-24 34 views
4

我想在ColdFusion中规范化一个字符串。在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> 

任何想法,为什么它总是输出äéöè,而不是一个标准化的字符串?

回答

8

在ColdFusion中,与Java不同,您不需要在字符串文字中转义反斜杠。您当前的正则表达式不会匹配任何不以反斜杠开头的内容,因此不会进行替换。

除此之外,你的代码是完全正确的,你可以看到在输出时字符串的长度是8而不是4。这是normalize呼叫的效果。

但是,请记住,它仍然是原始字符串的等效表示形式,因此您无法直观地分辨差异并不奇怪。这是正确的Unicode渲染。

+0

非常感谢您的回答! – patrickruetter 2012-07-25 06:01:44

3

"\\p"应该被简单地"\p"。比照的ReReplace()自动转义反斜线给你,所以你"\\p"解释Java方面如"\\\\p"

一个内胆:

<cfscript> 
var k = "mike's café"; 
k = createObject('java', 'java.text.Normalizer').normalize(k, createObject('java', 'java.text.Normalizer$Form').valueOf('NFD')).replaceAll('\p{InCombiningDiacriticalMarks}+','').replaceAll('[^\p{ASCII}]+',''); 
// k is now "mike's cafe" 
</cfscript> 

http://www.cfquickdocs.com/cf9/#rereplace

+0

奖金 - 我添加了一个'[^ \ p {ASCII}] +'去除非ascii字符。 – 2012-07-25 03:21:42

+0

谢谢,你也帮了我很多! – patrickruetter 2012-07-25 06:02:03