web-dev-qa-db-ja.com

Androidロケールを使用して国の絵文字フラグを取得する

Lollipop以来、Androidにはさまざまな国のEmojiフラグが組み込まれています。デバイスのロケールを使用してEmojiその国の旗?

Emojiフラグをユーザーの場所を含むTextViewに挿入したかったのです。

12
Mike Walker

私もそれを探していましたが、まだ可能ではないと思います。

こちらをご覧ください: http://developer.Android.com/reference/Java/util/Locale.html

フラグについては言及していません。

_

または、ここで答えを確認できます。

フラグとISOモバイルコードの取得の可用性を含むAndroid国リスト

それはあなたを助けるかもしれません。

0
The Berga

絵文字はUnicode記号です。 Unicode文字テーブルに基づく絵文字フラグは、ISO 3166-1 alpha-2 2文字の国コード( wiki )のエンコードに使用することを目的とした26個のアルファベットのUnicode文字(A〜Z)で構成されています。

つまり、2文字の国コードを分割し、各A〜Z文字を地域インジケータ記号文字に変換することが可能です。

private String localeToEmoji(Locale locale) {
    String countryCode = locale.getCountry();
    int firstLetter = Character.codePointAt(countryCode, 0) - 0x41 + 0x1F1E6;
    int secondLetter = Character.codePointAt(countryCode, 1) - 0x41 + 0x1F1E6;
    return new String(Character.toChars(firstLetter)) + new String(Character.toChars(secondLetter));
}

ここで、0x41は大文字のA文字を表し、0x1F1E6はUnicodeテーブルのREGIONAL INDICATOR SYMBOL LETTER Aです。

注:このコード例は簡略化されており、ロケール内では利用できない可能性のある国コードに関連するチェックは必要ありません。

29
Dmitry

この回答 に基づいて、拡張機能を使用して以下のKotlinバージョンを作成しました。

また、不明な国コードを処理するためのチェックをいくつか追加しました。

/**
 * This method is to change the country code like "us" into ????????
 * Stolen from https://stackoverflow.com/a/35849652/75579
 * 1. It first checks if the string consists of only 2 characters: ISO 3166-1 alpha-2 two-letter country codes (https://en.wikipedia.org/wiki/Regional_Indicator_Symbol).
 * 2. It then checks if both characters are alphabet
 * do nothing if it doesn't fulfil the 2 checks
 * caveat: if you enter an invalid 2 letter country code, say "XX", it will pass the 2 checks, and it will return unknown result
 */
fun String.toFlagEmoji(): String {
    // 1. It first checks if the string consists of only 2 characters: ISO 3166-1 alpha-2 two-letter country codes (https://en.wikipedia.org/wiki/Regional_Indicator_Symbol).
    if (this.length != 2) {
        return this
    }

    val countryCodeCaps = this.toUpperCase() // upper case is important because we are calculating offset
    val firstLetter = Character.codePointAt(countryCodeCaps, 0) - 0x41 + 0x1F1E6
    val secondLetter = Character.codePointAt(countryCodeCaps, 1) - 0x41 + 0x1F1E6

    // 2. It then checks if both characters are alphabet
    if (!countryCodeCaps[0].isLetter() || !countryCodeCaps[1].isLetter()) {
        return this
    }

    return String(Character.toChars(firstLetter)) + String(Character.toChars(secondLetter))
}

実行可能なコードスニペット

KotlinPlaygroundを使用して実行可能なKotlinスニペットも含めました。スニペットを実行するには、次のことを行う必要があります。

  1. [コードスニペットを表示]をクリックします
  2. 「コードスニペットの実行」をクリックします
  3. 生成されたコンソールの右上にある再生ボタンをクリックします
  4. 一番下までスクロールして結果を確認します(非表示になっています。)
    <script src="https://unpkg.com/[email protected]/dist/playground.min.js" data-selector=".code"></script>
    
    
    <div class="code" style="display:none;">
    
    /**
     * This method is to change the country code like "us" into ????????
     * Stolen from https://stackoverflow.com/a/35849652/75579
     * 1. It first checks if the string consists of only 2 characters: ISO 3166-1 alpha-2 two-letter country codes (https://en.wikipedia.org/wiki/Regional_Indicator_Symbol).
     * 2. It then checks if both characters are alphabet
     * do nothing if it doesn't fulfil the 2 checks
     * caveat: if you enter an invalid 2 letter country code, say "XX", it will pass the 2 checks, and it will return unknown result
     */
    fun String.toFlagEmoji(): String {
        // 1. It first checks if the string consists of only 2 characters: ISO 3166-1 alpha-2 two-letter country codes (https://en.wikipedia.org/wiki/Regional_Indicator_Symbol).
        if (this.length != 2) {
            return this
        }
    
        val countryCodeCaps = this.toUpperCase() // upper case is important because we are calculating offset
        val firstLetter = Character.codePointAt(countryCodeCaps, 0) - 0x41 + 0x1F1E6
        val secondLetter = Character.codePointAt(countryCodeCaps, 1) - 0x41 + 0x1F1E6
    
        // 2. It then checks if both characters are alphabet
        if (!countryCodeCaps[0].isLetter() || !countryCodeCaps[1].isLetter()) {
            return this
        }
    
        return String(Character.toChars(firstLetter)) + String(Character.toChars(secondLetter))
    }
    
    fun main(args: Array&lt;String&gt;){
      println("us".toFlagEmoji())
      println("AF".toFlagEmoji())
      println("BR".toFlagEmoji())
      println("MY".toFlagEmoji())
      println("JP".toFlagEmoji())
    }
    
    </div>
8

絵文字の国旗をAndroid TextView(これは非常に簡単です)に挿入する場合は、次の方法を試してください: TextView Androidに絵文字フラグを挿入する方法

1

私が最初にこの回答を書いたとき、私はどういうわけか私がAndroid via React Native!

とにかく、これがES6サポートの有無にかかわらず動作する私のJavaScriptソリューションです。

    function countryCodeToFlagEmoji(country) {
      return typeof String.fromCodePoint === "function"
        ? String.fromCodePoint(...[...country].map(c => c.charCodeAt() + 0x1f185))
        : [...country]
            .map(c => "\ud83c" + String.fromCharCode(0xdd85 + c.charCodeAt()))
            .join("");
    }

console.log(countryCodeToFlagEmoji("au"));
console.log(countryCodeToFlagEmoji("aubdusca"));

代わりに国コードを大文字で渡したい場合は、2つのオフセットを0x1f1a50xdda5に変更するだけです。

1
hippietrail

私はこれをとても簡単に使っています。 ここ からUnicodeを取得します。

バングラデシュの旗の場合はU+1F1E7 U+1F1E9さて、

{...

 String flag = getEmojiByUnicode(0x1F1E7)+getEmojiByUnicode(0x1F1E9)+ " Bangladesh";
    }
    public String getEmojiByUnicode(int unicode){
        return new String(Character.toChars(unicode));
    }

>(バングラデシュの旗)バングラデシュが表示されます

0
abir99