Java 在ColdFusion中规范化字符串

Java 在ColdFusion中规范化字符串,java,string,class,coldfusion,normalization,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, createObje

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

#串#

知道为什么它总是输出
而不是标准化字符串吗?

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

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

但是,请记住,它仍然是原始字符串的等效表示形式,因此无法直观地分辨差异也就不足为奇了。这是正确的Unicode呈现方式。

您的
“\\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>

var k=“迈克咖啡馆”;
k=createObject('java','java.text.Normalizer').normalize(k,createObject('java','java.text.Normalizer$Form').valueOf('NFD')).replaceAll('\p{incombindingDiaCriticalMarks}+','').replaceAll('[^\p{ASCII}]+','');
//k现在是“迈克咖啡馆”

我建议使用像Junidecode这样的Java库。

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

  • ääöè=aeoe
  • 迈克咖啡馆
  • ℡ = 电话
  • 北亰 = 北京
  • 先生。まさゆき たけだ = 武田正之先生
  • ⠏⠗⠑⠍⠊⠑⠗ = 总理
  • ราชอาณาจักรไทย = 拉赫·阿纳查克拉提
  • Ελληνικά=Ellenika
  • МчСчa=莫斯科
  • 哈亚斯坦

  • ℰ奖金-我添加了一个
    [^\p{ASCII}]+
    来去除非ASCII字符。谢谢,你也帮了我很多忙!仅供参考,您可以使用
    \P{ASCII}+
    而不是
    [^\P{ASCII}]+
    -大写的
    P
    表示否定。让我们来看看。