在 ColdFusion 中规范化字符串

问题描述 投票:0回答:3

我正在尝试在 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>

知道为什么它总是输出

äéöè
而不是标准化字符串吗?

java string class coldfusion normalization
3个回答
8
投票

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

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

normalize
调用的效果。

但是,请记住它仍然是原始字符串的等价表示,因此您无法从视觉上分辨出差异也就不足为奇了。这是正确的 Unicode 渲染。


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

(编辑:损坏的 cfquickdocs 链接。域注册已过期)


2
投票

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

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

  • äéöè = aeoe
  • 麦克的咖啡馆 = 迈克的咖啡馆
  • ℡ = 电话
  • 北瀛 = 北京
  • 先生まさゆきたけだ=武田正之先生
  • ⠏⠗⠑⠍⠊⠑⠗ =总理
  • ราชอาณาจักรไทย = raach`aanaacchakraithy
  • ελληνικά = 埃莱尼卡
  • Москвa = 莫斯科
  • Հայաստան = Hayastan
  • ℰ𝒳𝒜ℳ𝓟ℒℰ = 示例

我分享了一个完整的基于 ColdFusion 的演示(需要 Junidecode JAR 文件): https://dev.to/gamesover/convert-unicode-strings-to-ascii-with-coldfusion-junidecode-lhf

这里是代码函数:

<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>
© www.soinside.com 2019 - 2024. All rights reserved.