2012-04-17 24 views
4

次の文字があります。Javaのラテン文字を通常のテキストに変換する

â¥ŚŠŞŤŹŽŻąľśšşťźžżÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ

私は、私は、Java 1.4を使用しています

AcYSSSTZZZalssstzzzAAAAAAACEEEEIIIIDNOOOOOOUUUUYTSaaaaaaaceeeeiiiionoooooouuuuyty

に変換する必要があります。

Normalizer.decompose(text、true、0).replaceAll( "\ p {InCombiningDiacriticalMarks} +"、 "");文字を発音区別符号で置き換えるだけです。

¢¥ÆÐÞßæðøのような文字は変換されません。

JDK 1.4で効率的に変換を行う方法は何ですか。

助けてください。

よろしく、 スリデビ

+1

「Yuan」を意味すると考えると、Yは本当に同等のものではありません。 @ stephen-cが示唆しているようにルックアップテーブルを実装する必要があるでしょう – Deco

+0

ルックアップテーブルを作成し、ルックアップテーブルから同等の文字を取得するのに助けが必要です。私はルックアップテーブルに¥が含まれないようにしたいかもしれませんが、私はユニコード相当物を保存してYに変換したいかもしれません。 –

+0

@Decoと合意して、トピックに追加するだけでßは同等ですSのどちらか...少なくともドイツ語ではSSと同等で、 "Strasse"は "Strasse"ではなく "Strasse"で置き換えられます。 – Fredrik

答えて

3

は、どのように私は、JDK 1.4で変換を行うための効率的な方法何であることを行うことができます。

最も効率的な方法は、配列またはHashMapとして実装されたルックアップテーブルを使用することです。しかし、もちろん、テーブルに値を設定する必要があります。

¢¥ÆÐÞßæðøøのような文字は変換されません。

これらの文字は本当にローマ字ではありません。セマンティクスを使って無謀な自由を取ることなく、ローマ字には変換できません。例えば:

  • ¢と¥は、Æを
  • 通貨記号であり、AEは、いくつかの言語の二文字を表すこと合字であり、そして他のものは異なる文字であるにおいて、
  • SSはドイツ語でありますダブルス。
+0

ルックアップテーブルはどのように見えますか?私は、いくつかのエディタがそれらをサポートしないので、特殊文字でルックアップテーブルを保存する必要はありませんが、私はルックアップで同等のユニコードの文字を配置することができますはい、どのようにコードをする必要がありますか?私はルックアップテーブルからユニコード文字を取得しなければならないと私はそれを通常のテキストに変換するのだろうか? –

+0

私は 'char []'がHashMapよりも効率的であると思いました。 ;) –

+0

@PeterLawrey - 入力セットのサイズ、およびスペースや時間を最適化するかどうかによって異なります。 –

2

私はこのようにします。 Javaの1.4の更新された

(削除ジェネリック)

public class StringConverter { 

    char[] source = new char[]{'Ą', '¢', '¥', 'Ś'}; // all your chars here... 
    char[] target = new char[]{'A', 'c', 'Y', 'S'}; // all your chars here... 
    //Build a map 
    HashMap map; 

    public StringConverter() { 
     map = new HashMap(); 
     for (int i = 0; i < source.length; i++) { 
      map.put(new Character(source[i]), new Character(target[i])); 
     } 
    } 

    public String convert(String s) { 
     char[] chars = s.toCharArray(); 
     for (int i = 0; i < chars.length; i++) { 
      chars[i] = map.get(chars[i]); 
     } 
     return new String(chars); 
    } 

} 
+0

JDK 1.4を使用しています。デフォルトのCP1252エンコーディングとしてEclipseサポートとして特殊文字を格納したくありません。 –

+3

EclipseのデフォルトのエンコーディングとJavaバージョンの間の接続は何ですか? EclipseのデフォルトのエンコーディングをUTF-8に変更することはできますが、それでも機能するはずです。 – Sorin

+0

ありがとうございます。私はHashMap マップ用のJava 1.4について述べました。 –

6

は特にICU4J部分、ICU projectをチェックしてください。 Transliteratorクラスが問題を解決します。ここ

は、ラテン文字に任意のスクリプトを変換し、任意のアクセントと非ASCII文字を削除Transliterator例である:

Transliterator accentsConverter = Transliterator.getInstance("Any-Latin; NFD; [:M:] Remove; NFC; [^\\p{ASCII}] Remove"); 

Any-Latin部が変換を行う、NFD; [:M:] Remove; NFCがアクセントを除去し、[^\\p{ASCII}] Removeは以外を除去します-ascii文字は残ります。

結果を得るにはaccentsConverter.transliterate(yourString)に電話するだけです。

ICU Transformations guideに変換ID(パラメータTransliterator.getInstance)を作成する方法の詳細を読むことができます。

+0

しかし、私は変換の例としてYを意味したいと思う。 –

+0

@Decoがコメントに書いたのと同様に、¥とYは正しい変換ではない。しかし、これらの特別なニーズのために、期待するコンバージョンのマッピングを作成し、最初にそれをICUに渡すことができます。 – Sorin

関連する問題