在ColdFusion中规范化字符串

时间:2012-07-24 07:27:19

标签: java string class coldfusion normalization

我正在尝试将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 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:4)

您的"\\p"应该只是"\p"。 Cf的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

答案 2 :(得分:0)

我建议使用像Junidecode这样的Java库。 https://github.com/gcardone/junidecode

它将UTF8和UTF16字符串转换为ASCII7。例子:

  • äéöè= aeoe
  • 迈克的咖啡馆=迈克的咖啡馆
  • ℡=电话
  • 北亰=北京
  • 先生まさゆきたけだ=武田正行先生
  • ⠏⠗⠑⠍⠊⠑⠗=总理
  • ราชอาณาจักรไทย= raach`aanaacchakraithy
  • Ελληνικά= Ellenika
  • Москвa=莫斯科
  • Հայաստան=哈亚斯坦
  • ℰ??ℳ?ℒℰ=示例

我已经共享了一个完整的基于ColdFusion的演示(需要Junidecode JAR文件): https://gamesover2600.tumblr.com/post/182608667654/coldfusion-unicode-junidecode-demo

这是代码功能:

<cfscript>
function JUnidecode(inputString){
    var JUnidecodeLib = "";
    var response = "";
    var temp = {};
    temp.encoder = createObject("java", "java.nio.charset.Charset").forName("utf-8").newEncoder();
    temp.isUTF = temp.encoder.canEncode(arguments.inputString);
    if (temp.isUTF){
        /* NFKC: UTF Compatibility Decomposition, followed by Canonical Composition */
        temp.normalizer = createObject( "java", "java.text.Normalizer" );
        temp.normalizerForm = createObject( "java", "java.text.Normalizer$Form" );
        arguments.inputString = temp.normalizer.normalize( javaCast( "string", arguments.inputString ), temp.normalizerForm.NFKC );
    }
    try {
        JUnidecodeLib = createObject("java", "net.gcardone.junidecode.Junidecode");
        response = JUnidecodeLib.unidecode( javacast("string", arguments.inputString) );
    } catch (any e) {
        response = "ERROR: JUnidecode is not installed";
    }
    return trim(Response.replaceAll("\[\?\]", ""));
}
function isDiff(compareArr, val, pos){
    return (pos GT arrayLen(comparearr) OR comparearr[pos] neq val);
}
</cfscript>