web-dev-qa-db-fra.com

Support Unicode pour Android

Je suis nouveau dans Android. Je souhaite savoir si Android prend en charge l’Unicode. Si oui, comment pouvons-nous l'utiliser via le code Java? J'ai écrit un programme

TextView tv = new TextView(this);
tv.setText("Hello, চন্দন");
setContentView(tv);

Les caractères unicode en bengali viennent sous forme de boîtes.

Merci d'avance.

13
Chandan

"Prise en charge de l'Unicode" - qui est simplement une norme de codage de caractères - et l'affichage du texte Unicode de manière à pouvoir être lu correctement sont des choses complètement différentes.

Ce dernier requiert à la fois une police appropriée pour le script concerné et un moteur de rendu de texte complexe qui applique les règles incorporées dans la police pour afficher le texte correctement. Sous Windows, cela est géré par la bibliothèque système appelée Uniscribe, sur les systèmes Apple par ATSUI et sur les systèmes Linux par Pango. Android est basé sur Linux, mais malheureusement, Google semble avoir supprimé les éléments permettant de gérer des scripts complexes. (Une décision plutôt étrange, car la plupart des appareils Android sont destinés aux communications comprenant du texte.) Les scripts complexes fonctionnent bien sur les autres appareils mobiles utilisant un système d'exploitation basé sur Linux tel que le Nokia N9 et le N900.

Android rend également difficile pour les utilisateurs d'installer des polices supplémentaires ou des dispositions de clavier pouvant être utilisées par différentes applications sans "enraciner" leur téléphone ou leur tablette. 

Quelques fabricants d’appareils Android ont eux-mêmes mis en place une prise en charge (par exemple, les téléphones des séries ST et MT de Sony Ericsson semblent prendre très bien en charge le Devanagari et d’autres Indic.) Sur certains téléphones Android, les scripts Indic rendent navigateur - parce que le développeur du navigateur a ajouté une prise en charge propre - mais ne fonctionnera pas dans d'autres applications.

Veuillez consulter: http://code.google.com/p/Android/issues/detail?id=4153

Jusqu'à ce que ce problème soit correctement résolu dans Android, la plupart des appareils exécutant ce système d'exploitation semblent constituer un mauvais choix pour les utilisateurs souhaitant utiliser des scripts tels que Devanagari, Tamil, Bengali, Kannada, Punjabi, Telugu, Tibétain, Khmer, Sinhala, Malayalam, Burmes et ainsi de suite sur leur smartphone ou leur tablette.

La partie d'Android qui nécessite des corrections pour prendre en charge des scripts complexes est libskia.so et libwebcore.so. Ainsi, si vous écrivez des applications prenant en charge les langues indiennes, vous pouvez essayer de remplacer ces bibliothèques par vos propres versions modifiées.

34
Sahaja

Android prend en charge l’Unicode, mais les polices incluses ne couvrent pas tous les caractères Unicode et le rendu ne prend pas en charge tous les types de scripts. En particulier, les polices incluses ne couvrent que les caractères d'Europe occidentale (latin), cyrillique, grec et CJK. Même si vous installez de nouvelles polices, il apparaît qu'Android ne prend pas correctement en charge certaines formes de disposition de texte indicatif telles que Devanagari, comme indiqué dans bug 4153 . Je ne connais pas suffisamment le script bengali pour savoir s'il nécessite un rendu spécial, comme Devanagari, mais s'il le fait, il n'est probablement pas pris en charge sur Android, même si vous installez une police qui le prend en charge.

8
Brian Campbell

Vous pourrez peut-être contourner ce problème avec une police spécialisée, comme indiqué dans cette SO réponse à propos du tamoul sous Android .

3
sampablokuper

Le script bengali a besoin de ligatures comme Devanagari. Il est donc peu probable que Android rende correctement le bengali.

1
uddip

J'ai aimé la réponse complète de Sahaja. 

Des efforts sont en cours pour transférer le moteur de rendu Harfbuzz-ng sur Android. Voici un lien vers le code source de portage de Harfbuzz-ng pour kannada , l’une des langues indiennes, rendu du texte. 

1
Supreethks

Créez un nom de mise en page sous le nom list.xml.

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:padding="10dp"
    Android:textSize="20sp" >
</TextView>

Ajouter un TextView et un ListView dans votre activity_main.xml

<TextView
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:textAppearance="?android:attr/textAppearanceLarge"
    Android:text="Large Text"
    Android:id="@+id/textView" />
<ListView
       Android:layout_width="match_parent"
       Android:layout_height="wrap_content"
       Android:id="@+id/listView" />

MainActivity.Java

public class MainActivity extends AppCompatActivity {        
    ListView listView;
    TextView textView;

    static final String[] BANGLA = new String[] {
            "Barguna District (বরগুনা)",
            "Barisal District (বরিশাল)",
            "Bhola District (ভোলা)",
            "Jhalokati District (ঝালকাঠি)",
            "Patuakhali District (পটুয়াখালী)",
            "Pirojpur District (পিরোজপুর)",
            "Bandarban District (বান্দরবান)",
            "Brahmanbaria District (ব্রাহ্মণবাড়ীয়া)",
            "Chandpur District (চাঁদপুর)",
            "Chittagong District (চট্টগ্রাম)",
            "Comilla District (কুমিল্লা)",
            "Cox's Bazar District (কক্সবাজার)",
            "Feni District (ফেনী)",
            "Khagrachhari District (খাগড়াছড়ি)",
            "Lakshmipur District (লক্ষ্মীপুর)",
            "Noakhali District (নোয়াখালী)",
            "Rangamati District (রাঙ্গামাটি)",
            "Dhaka District (ঢাকা)",
            "Faridpur District (ফরিদপুর)",
            "Gazipur District (গাজীপুর)",
            "Gopalganj District (গোপালগঞ্জ)",
            "Kishoreganj District (কিশোরগঞ্জ)",
            "Madaripur District (মাদারীপুর)",
            "Manikganj District (মানিকগঞ্জ)",
            "Munshiganj District (মুন্সীগঞ্জ)",
            "Narayanganj District (নারায়ণগঞ্জ)",
            "Narsingdi District (নরসিংদী)",
            "Rajbari District (রাজবাড়ী)",
            "Shariatpur District (শরীয়তপুর)",
            "Tangail District (টাঙ্গাইল)",
            "Bagerhat District (বাগেরহাট)",
            "Chuadanga District (চুয়াডাঙ্গা)",
            "Jessore District (যশোর)",
            "Jhenaidah District (ঝিনাইদহ)",
            "Khulna District (খুলনা)",
            "Kushtia District (কুষ্টিয়া)",
            "Magura District (মাগুরা)",
            "Meherpur District (মেহেরপুর)",
            "Narail District (নড়াইল)",
            "Satkhira District (সাতক্ষিরা)",
            "Jamalpur District (জামালপুর)",
            "Mymensingh District (ময়মনসিংহ)",
            "Netrakona District (নেত্রকোনা)",
            "Sherpur District (শেরপুর)",
            "Bogra District (বগুড়া)",
            "Joypurhat District (জয়পুরহাট)",
            "Naogaon District (নওগাঁ)",
            "Natore District (নাটোর)",
            "Chapainawabganj District (নওয়াবগঞ্জ)",
            "Pabna District (পাবনা)",
            "Rajshahi District (রাজশাহী)",
            "Sirajgonj District (সিরাজগঞ্জ)",
            "Dinajpur District (দিনাজপুর)",
            "Gaibandha District (গাইবান্ধা)",
            "Kurigram District (কুড়িগ্রাম)",
            "Lalmonirhat District (লালমনিরহাট)",
            "Nilphamari District (নীলফামারী)",
            "Panchagarh District (পঞ্চগড়)",
            "Rangpur District (রংপুর)",
            "Thakurgaon District (ঠাকুরগাঁও)",
            "Habiganj District (হবিগঞ্জ)",
            "Moulvibazar District (মৌলভীবাজার)",
            "Sunamganj District (সুনামগঞ্জ)",
            "Sylhet District (সিলেট)"
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        textView= (TextView)findViewById(R.id.textView);
        textView.setText(Html.fromHtml("বাংলাদেশের জেলা সমূহ"));
        edittext = (EditText)findViewById(R.id.editText);
        imageView= (ImageView)findViewById(R.id.imageView);

        listView=(ListView)findViewById(R.id.listView);

        listView.setAdapter(new ArrayAdapter<String>(this,R.layout.list, BANGLA));

   }
}

J'espère que ceci vous aidera...

0
Monzur

Android prend en charge le format Unicode prêt à l'emploi. Votre langage particulier pourrait ne pas être pris en charge. Vous pouvez trouver la liste des environnements locaux pris en charge pour chaque version du SDK en consultant Platform Notes .

0
Konstantin Burov