Поддержка Юникода для Android - PullRequest
14 голосов
/ 14 марта 2011

Я новичок в Android. Я хочу знать, поддерживает ли Android Unicode. Если да, то как мы можем использовать его через код Java. Я написал программу

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

Символы бенгальского юникода идут в виде ящиков.

Заранее спасибо.

Ответы [ 7 ]

34 голосов
/ 30 апреля 2012

«Поддержка Unicode» - это просто стандарт кодировки символов - и отображение текста Unicode так, чтобы его можно было правильно прочитать, - это совершенно разные вещи.

Для последнего требуется как правильный шрифт для соответствующего скрипта, так и сложный механизм рендеринга текста, который применяет правила, встроенные в шрифт, для правильного отображения текста. В Windows это выполняется системной библиотекой Uniscribe, в системах Apple от ATSUI и в системах Linux от Pango. Android основан на Linux, но, к сожалению, Google, похоже, удалил части для обработки сложных скриптов. (Довольно странное решение, поскольку большинство устройств Android предназначены для связи, в том числе текстовой.) Сложные сценарии отлично работают на других мобильных устройствах с использованием операционной системы на базе Linux, такой как Nokia N9 и N900

.

Android также затрудняет пользователям установку дополнительных шрифтов или раскладок клавиатуры, которые могут использоваться различными приложениями без «рутирования» своего телефона или планшета.

Несколько производителей устройств Android реализовали поддержку самостоятельно (например, телефоны Sony Ericsson серии ST и MT, кажется, очень хорошо поддерживают Devanagari и другие индикативные скрипты.) На некоторых телефонах Android скрипты Indic будут отображаться нормально в браузере - потому что разработчик браузера добавил собственную поддержку, но не будет работать в других приложениях.

Пожалуйста, смотрите: http://code.google.com/p/android/issues/detail?id=4153

До тех пор, пока эта проблема не будет должным образом исправлена ​​в Android, большинство устройств, работающих под этой операционной системой, кажется плохим выбором для пользователей, которые хотят использовать такие скрипты, как деванагари, тамильский, бенгальский, каннада, пенджабский, телугу, тибетский, кхмерский, сингальский, Малайялам, бирманцам и т. Д. На их смартфоне или планшете.

Часть Android, требующая исправления для поддержки сложных скриптов, - это libskia.so и libwebcore.so. Поэтому, если вы пишете приложения для поддержки индийских языков, вы можете попробовать заменить эти библиотеки на свои собственные измененные версии.

8 голосов
/ 15 марта 2011

Android поддерживает Unicode, но включенные шрифты не охватывают все символы Unicode, а рендеринг не поддерживает все типы сценариев. В частности, включенные шрифты охватывают только западноевропейские (латинские), кириллические, греческие символы и символы CJK. Даже если вы устанавливаете новые шрифты, похоже, что Android не поддерживает должным образом некоторые формы разметки текста, такие как Devanagari, как упомянуто в bug 4153 . Я недостаточно знаком со сценарием бенгали, чтобы знать, требует ли он какого-либо специального рендеринга, как это делает Devanagari, но если это так, то он, скорее всего, не поддерживается в Android, даже если вы установите шрифт, который его поддерживает.

3 голосов
/ 14 июня 2012

Вы можете обойти эту проблему с помощью специализированного шрифта, как видно из этого SO ответа о тамильском на Android .

1 голос
/ 24 сентября 2016

Создайте имя макета как 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>

Добавьте TextView и ListView в вашем 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));

   }
}

Надеюсь, это поможет вам ...

1 голос
/ 20 июня 2012

Мне понравился исчерпывающий ответ от Сахаджи.

В настоящее время предпринимаются некоторые усилия для переноса механизма рендеринга Harfbuzz-ng на Android.Вот ссылка на исходный код портирования Harfbuzz-ng для каннада , одного из индийских языков, рендеринга текста.

1 голос
/ 06 июля 2011

Бенгальский сценарий нуждается в лигатурах, таких как Деванагари, поэтому маловероятно, что андроид правильно отобразит бенгальский.

0 голосов
/ 14 марта 2011

Android поддерживает Unicode из коробки.Ваш конкретный язык может не поддерживаться, хотя.Вы можете найти список поддерживаемых языков для каждой версии SDK, просмотрев Замечания по платформе .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...