2

Java で強調された母音に対して char リテラルを入力しようとしましたが、コンパイラは次のように言います:閉じていない文字リテラル

これは私がやろうとしていることです:

 char [] a = {'à', 'á', 'â', 'ä' };

Unicode を使用してみまし'\u00E0'たが、何らかの理由でコードと一致しません:

 for( char c : string.toCharArray() ) {
     if( c == a[i] ) {
         // I've found a funny letter 
     }
 }

if文字列に何を入れても、trueと評価されることはありません。

これが私がコーディングしようとしている完全なプログラムです。

4

5 に答える 5

6

コードは正しいエンコーディングでコンパイルする必要があります。

javac -encoding UTF-8 Foo.java

どこかにエンコーディングの不一致があります。

public class Foo {
  char [] a = {'à', 'á', 'â', 'ä' };  
}

UTF-8 として保存された上記のコードは、16 進ダンプになります。

70 75 62 6C 69 63 20 63 6C 61 73 73 20 46 6F 6F         public class Foo
20 7B 0D 0A 20 20 63 68 61 72 20 5B 5D 20 61 20          {__  char [] a
3D 20 7B 27 C3 A0 27 2C 20 27 C3 A1 27 2C 20 27         = {'__', '__', '
C3 A2 27 2C 20 27 C3 A4 27 20 7D 3B 20 20 0D 0A         __', '__' };  __
7D 0D 0A 0D 0A                                          }____

コード ポイント U+00E0 (à) の UTF-8 値は ですC3 A0

コードは正しいエンコーディングでコンパイルする必要があります。

javac -encoding UTF-8 Foo.java

à が組み合わせシーケンス U+0061 U+0300 で表される外部の可能性があります。これがNFDフォームです (これをテキスト入力のデフォルトとして使用するテキスト エディターに出会ったことはありません)。Thorbjørn Ravn Andersen が指摘しているように、多くの場合、常に \uXXXX エスケープ シーケンスを使用する方が適切です。

また、入力デバイス (ファイル/コンソール/など) を確認する必要があります。

最後の手段として、chars を 16 進数としてダンプし、文字インスペクターSystem.out.format("%04x", (int) c);を使用して手動でデコードして、それらが何であるかを調べることができます。

于 2009-12-21T21:45:40.323 に答える
5

Unicode 文字が機能するためには、javac がそれが書き込まれたときと同じエンコーディングでそれを読み取ることを確認する必要があります。

\uXXXX 表記を使用するだけで、多くの問題を解決できます。

于 2009-12-21T20:29:06.890 に答える
1

これは簡単なテストで私にとってはうまくいくようでした:

static char [] a = {'à', 'á', 'â', 'ä' };


    public static boolean foundMatch(String s){

        boolean test = false;
        for(int i=0;i < a.length;i++){
            String t = String.valueOf(a[i]);
            test = s.contains(t);
            if (test) return true;
    }
        return test;
    }
于 2009-12-21T20:41:02.547 に答える
1

何を達成する必要があるか (つまり、文字列内のアクセント付き文字を見つける必要がある理由) について言及していません。入力の一部にアクセント付き文字が存在するかどうかを単に確認するだけでなく、それ以上のことを行う必要があると思います。 . あなたがすでに知っていることをあなたに話すリスクについて:

  • それらをテキスト文字列から除外する必要がある場合は、ブラックリストではなくホワイトリストを使用することをお勧めします.
  • 強調に関係なくアルファベット順に並べ替える必要がある場合は、独自のシステムではなくjava.text.Collat​​orを使用してください。
  • アクセント付きの文字を「ベース」文字に置き換える必要がある場合は、Collat​​orが再び役立つはずです (内部の分解要素)。まさに。
于 2009-12-21T20:48:20.563 に答える
1

Unicode 文字値を検索し、形式のリテラルを使用します\uxxxx

U+00e は、グラブ アクセントの a です。

char aacute = '\u00e1';

次の質問は、文字列がどこから来たかです。これらの文字が含まれていると確信していますか? 合成キャラとして?16進数でいくつかを印刷して見てください。

正規化が必要になる場合があります (Java 1.6 または icu4j を使用)。

于 2009-12-21T20:24:24.437 に答える