8

私のアプリには外部プロセスから文字列が供給されています。各文字列は 2 文字または 5 文字の長さで、java.util.Locales を表します。例えば:

en-us

最初の例は 5 文字の文字列で、"en" は ISO 言語コード、"us" は ISO 国コードです。これは、「en_US」ロケールに対応している必要があります。2 番目の例は 2 文字の文字列のみで、"ko" は ISO 言語コードであり、"ko_KR" (韓国語) ロケールに対応する必要があります。

これらの文字列 (2 文字または 5 文字のいずれか) を取得し、それを (サポートされている Java 6ロケールとして) 検証し、それを使用して Locale インスタンスを作成する方法が必要です。

Locale にこのような検証が最初から組み込まれていることを願っていましたが、残念ながら、このコードは例外がスローされることなく実行されます。

Locale loc = new Locale("waawaaweewah", "greatsuccess");

// Prints: "waawaaweewah"
System.out.println(loc.getDisplayLanguage());

だから私は、これらの文字列が私に与えられる2つの形式を考えて、どうすればいいですか:

  • 文字列 (両方の形式) を検証し、存在しないかサポートされていない Java 6 ロケールに対応する文字列に対して例外をスローします。と
  • 文字列から新しいロケールをインスタンス化しますか? この質問は、「ko」しかなく、「ko_KR」ロケールなどにマップする必要がある 2 文字の形式に実際に当てはまります。

前もって感謝します!

4

2 に答える 2

8

Locale.getISOCountries()およびLocale.getISOLanguages()

それぞれ ISO 3166 と ISO 639 で定義されているすべての 2 文字の国コードと言語コードのリストを返し、ロケールの作成に使用できます。

これを使用して、入力を検証できます。

于 2013-03-27T16:09:12.470 に答える
3

2 つのオプションがあります。

  1. これを行うにはライブラリを使用してくださいStringLocale
  2. 独自の方法ですが、有効な国コードのセットが多数あるため、ここでの検証は自明ではありません。 javadocLocaleを参照してください。

開始点は、要素の数を分割しStringてオンにすることです。

public static Locale parseLocale(final String locale) {
    final String[] localeArr = locale.split("_");
    switch (localeArr.length) {
        case 1:
            return new Locale(localeArr[0]);
        case 2:
            return new Locale(localeArr[0], localeArr[1]);
        case 3:
            return new Locale(localeArr[0], localeArr[1], localeArr[2]);
        default:
            throw new IllegalArgumentException("Invalid locale format;");
    }
}

String[]おそらく、コンストラクターを呼び出す前に、すべての有効な国コードと言語のリストを取得し、 の要素を有効な値と比較する必要があります。

于 2013-03-27T16:15:15.160 に答える