4

私はColdFusionで文字列を正規化しようとしています。

java.text.NormalizerCFには私が知る限り、同様の機能がないため、これにはJavaクラスを使用したいと思います。

これが私の現在のコードです:

<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>

正規化された文字列ではなく、常に出力する理由はäéöèありますか?

4

3 に答える 3

8

ColdFusionでは、Javaとは異なり、文字列リテラルで円記号をエスケープする必要はありません。現在の正規表現は、円記号で始まらないものとは一致しないため、置き換えは行われません。

それ以外は、コードは完全に正しく、出力時に文字列の長さが4ではなく8であることがわかります。これはnormalize呼び出しの効果です。

ただし、それでも元の文字列と同等の表現であるため、視覚的に違いがわからないことは驚くことではありません。これは、実際の正しいUnicodeレンダリングです。

于 2012-07-24T10:36:14.880 に答える
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

于 2012-07-25T03:20:37.277 に答える
1

JunidecodeのようなJavaライブラリを使用することをお勧めします。 https://github.com/gcardone/junidecode

UTF8およびUTF16文字列をASCII7に変換します。例:

  • äéöè=aeoe
  • マイクのカフェ=マイクのカフェ
  • ℡=TEL
  • 北亰=ベイジン
  • まさゆきたけださん=武田正幸さん
  • ⠏⠗⠑⠍⠊⠑⠗=プレミア
  • ราชอาณาจักรไทย=raach`aanaacchakraithy
  • Ελληνικά=エレニカ
  • Москвa=モスクワ
  • Հայաստան=ハヤスタン
  • ℰℳℒℰ=例

完全な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>
于 2019-06-14T14:58:40.423 に答える