首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >规范化ColdFusion中的字符串

规范化ColdFusion中的字符串
EN

Stack Overflow用户
提问于 2012-07-24 15:27:19
回答 3查看 588关注 0票数 4

我正在尝试在ColdFusion中规范化一个字符串。

我想使用Java类java.text.Normalizer来完成这个任务,因为据我所知CF没有任何类似的函数。

下面是我当前的代码:

代码语言:javascript
复制
<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>

你知道为什么它总是输出äéöè而不是规范化的字符串吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-24 18:36:15

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

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

但是,请记住,它仍然是原始字符串的等效表示形式,因此无法从视觉上区分它们也就不足为奇了。这是实际使用中的正确Unicode呈现。

票数 8
EN

Stack Overflow用户

发布于 2012-07-25 11:20:37

您的"\\p"应该简单地为"\p"。Cf的ReReplace()自动为您转义反斜杠,因此您的"\\p"在Java端被解释为"\\\\p"

一个线条:

代码语言:javascript
复制
<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

票数 4
EN

Stack Overflow用户

发布于 2019-06-14 22:58:40

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

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

  • äéöè= aeoe
  • mike's café= mike's café=mike‘s cafe

=TEL

= Bei <℡>H110先生。示例= masayuki takeda

  • ⠏⠗⠑⠍⠊⠑⠗= premier
  • ราชอาณาจักรไทย= raach`aanaacchakraithy
  • Ελληνικά= Ellenika
  • Москвa = Moskva
  • Հայաստան= Hayastan
  • ℰℳℒℰ=

まさゆきたけだ

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

下面是代码函数:

代码语言:javascript
复制
<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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11626050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档