Как заставить Android-устройство отображать сложную визуализацию индийских символов?

Пожалуйста, извините за длину этого вопроса. Мне нужно объяснить все это, чтобы помочь другим и избежать того, чтобы полезные участники давали ответ, не спрашивая разъяснений.

Мое требование в одной строке: «чтобы телефон Android правильно отображал тамильские символы».

Проработка: Тамильский, как и любой другой индийский язык, имеет сложную систему рендеринга символов. В отличие от английского или другого письма на основе латиницы, в нем есть глиф (то, что вы видите на экране), состоящий из более чем одного символа. У Android нет возможности отображать такие сложные скрипты (за исключениями). Моя цель — узнать, как я могу обеспечить такую ​​возможность для телефона или планшета Android.

Небольшая предыстория, которую я собрал до сих пор: чтобы отобразить глиф на экране, Android сначала нужен подходящий файл шрифта. На устройстве Android есть папка /system/fonts , в которой их немного. Самый интересный файл в этой папке — DroidSansFallback.ttf. Как следует из названия, когда системе Android не удается найти символ в системных шрифтах (это может быть DroidSans.ttf или DroidSans-Bold.ttf и т. д.), она возвращается к поиску в DroidSansFallback.ttf.

Заменив подходящий файл шрифта с ПК (Latha.ttf или Lohit-Tamil.ttf — это шрифты для тамильского языка) и DroidSansFallback.ttf, вы сможете отображать тамильские символы на устройстве. Его не так просто заменить, и он включает в себя рутирование устройства и монтирование системы как доступной для записи.

Несмотря на эти проблемы, даже при замене DroidSansFallback.ttf отображаемые тамильские символы не отображаются должным образом. Тамильский символ «தி» представляет собой соединение двух символов, и вместо того, чтобы отображаться как «தி», он будет отображаться как «த ி» без пробела между ними. Хотя этого достаточно для чтения коротких сообщений, его нельзя использовать для чтения книг и т. д.

Начиная с Android 4.0 и выше, тамильский и несколько других языков поддерживаются через браузер, как указано в обзоре API Android 4.x, как показано ниже.

Support for Indic fonts (Devanagari, Bengali, and Tamil, including the complex
character support needed for combining glyphs) in WebView and the built-in Browser

Следует обратить внимание на слова «в WebView и встроенном браузере», что означает, что символы тамильского языка будут отображаться идеально, если они отображаются как содержимое HTML, и не будут отображаться в противном случае. Opera и несколько других браузеров делали это еще до Android 4.0, заменяя символ изображением.

Я заметил, что на нескольких устройствах, ориентированных на индийский рынок (например, LG Optimus One, большинство телефонов и планшетов Samsung), они могут правильно отображать тамильский язык как в браузере, так и вне браузера, например, в контактах, текстовых сообщениях, именах файлов и т. д. , К моему удивлению, они делают это даже в Android 2.3 и выше. Я также заметил, что та же модель, ориентированная на неиндийскую страну и использующая ту же версию Android, не поддерживает отображение тамильских символов.

Это заставило меня продолжить расследование и прийти к выводу, что Android (как и другие ОС на базе Linux) зависит от механизма рендеринга шрифтов для отображения таких сложных символов. Два двигателя, с которыми я столкнулся, это Skia и Harfbuzz. Я заметил, что LG использует skia, а Samsung использует библиотеки Harfbuzz в своих устройствах, чтобы реализовать эту возможность.

Я наткнулся на множество сайтов, предлагающих заменить эти библиотеки и шрифты. Это не сработало и привело к зависанию. К счастью, я сделал резервную копию с помощью clockworkmod и, следовательно, восстановил свой телефон.

Хотя я объяснил это на тамильском языке, это применимо к большинству индийских языков.

А вот и мой вопрос (если вы все еще читаете ;)) Теперь, конечно, ясно, что файл TTF должен присутствовать для предоставления символов, и для их правильного отображения требуются соответствующие библиотеки (libskia.so или libharfbuzz.so). Кто-нибудь знает, как эти производители могут предоставить такую ​​возможность? Я даже готов собрать свой собственный ПЗУ из AOSP (Android Open Source Project).

Cyanogenmod имеет возможность отображать рендеринг текстов справа налево. Skia является стандартным для рендеринга графики. Результаты будут различаться, взятие одной библиотеки Skia из одного ПЗУ и помещение ее в другое может привести к катастрофическим последствиям, так как потребуется сборка с нуля, взятие исходного кода AOSP, замена Skia на harfbuzz и перекомпиляция (вы просто не можете «просто» вставить harfbuzz в другое ПЗУ, которое не собрано с этой библиотекой — библиотеки связаны, поэтому, если сборка ПЗУ не поддерживает harfbuzz, она не будет работать)
@narayanan по какой-то причине сайт m.oneindia.in/tamil отлично отображает тамильский язык в Chrome на Android 4.1.2. Что этот сайт делает правильно, чего не делают другие?

Ответы (4)

Укорененный телефон

Android в папке /system/fontsсодержит файл с именем «DroidSansFallback.ttf», который должен содержать все языковые символы. В настоящее время многие из них не поддерживаются, включая тамильский.

Всегда можно заменить файл файлом, содержащим символы тамильского языка, что позволяет использовать тамильский язык на вашем телефоне.

Из ветки разработчиков XDA — DroidSans Fallback Indic Font пользователи пробовали и успешно использовали тамильский язык на своих телефонах.

Чтобы выполнить этот метод, вам нужен root-доступ к вашему телефону, чтобы получить доступ /systemи изменить резервный файл:

  • Читать Как мне получить root права на мое устройство? если ваш телефон еще не рутирован.
  • Подпишитесь на ветку XDA Developers , чтобы узнать, как заменить файл :

    Using and Android SDK environment:
    
    First Copy the DroidSansFallback.ttf file into your sdcard,
    then issue the following commands:
    
    adb shell
    su
    mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system
    cd /sdcard
    busybox cp DroidSansFallback.ttf /system/fonts
    mount -o ro,remount -t yaffs2 /dev/block/mtdblock3 /system
    exit
    exit
    
    Lastly, rebooted the phone
    

    Примечание: точка подключения не одинакова для всех телефонов.


ПРИЛОЖЕНИЕ для Android

Хотя описанный выше метод может понравиться некоторым пользователям, я предпочитаю приложение, когда оно доступно.

Кроме того, в тамильской клавиатуре всего 247 символов, а в английской всего 26. Таким образом, это становится серьезной проблемой при наборе текста:

См. Википедию :: Тамильский язык - Система письма

Текущий тамильский сценарий состоит из 12 гласных, 18 согласных и одного специального символа, айтам. Гласные и согласные объединяются, образуя 216 составных символов, всего 247 символов (12 + 18 + 1 + (12 x 18))


Благодаря Кришану и работе над этой темой уже есть приложение для решения обеих проблем, общесистемного использования тамильского языка и клавиатуры, которую можно использовать для ввода тамильских символов.

Прочтите сообщение Кришана под названием Tamil Unicode Font for Android — Working , чтобы получить подробную информацию о разработке этого решения.

Обобщить

Кришан разработал и опубликовал в Google Play два приложения , которые полностью решают проблему наличия всей ОС Android на тамильском языке:

Я уже упоминал, что замена шрифта — это лишь частичное решение, которое будет отображать только неконъюнктивные символы, а конъюнктные символы не будут отображаться должным образом. И второе решение, касающееся приложения, для меня неприемлемо. Он предоставляет возможность составлять текст на тамильском языке, набирая текст на английском языке, а преобразование и цитирование веб-страниц в качестве примера неприемлемо, как я уже сказал в своем ожидании. В любом случае спасибо за ваши усилия и время.

Похоже, вы описываете проблему 4153 , известную ошибку в Android.

Сообщается, что эта проблема решена в Jelly Bean. Если этот снимок экрана правильный, проблема должна быть решена. (Я не могу сказать себе, но у меня есть доступ к Jelly Bean, и я могу делать из него скриншоты.)

Тестовая страница ICS для Unicode

Спасибо, похоже, это не просто ошибка, поскольку я заявил, что рендеринг на тамильском языке работает даже в телефонах с Android 2.3.3 при некотором вмешательстве производителя.
20 июля 2012 года я присутствовал на gDays Google, и я стал свидетелем того, как Android JellyBean 4.1 отображал тамильские символы даже вне браузера. К сожалению больше ничего протестировать не смог.
Комментируя вопрос android.stackexchange.com/questions/26797/… Я бы сказал, что могу читать на тамильском языке веб-страницы, текстовые файлы, SMS, контакты, имена файлов, файлы DOCX через ThinkFree Office Mobile Viewer. Я заметил, что то же самое должно быть и для телугу, каннада, бенгали и хинди.

Установите веб-браузер Opera Mini

В веб-браузере Opera Mini введите «about: Config»

использовать растровые шрифты для сложных сценариев: выберите «Да».

Вы можете просматривать все сайты тамильским шрифтом на мобильном телефоне любой марки.

С уважением

Это внутреннее растровое отображение браузера, а не решение для всей ОС (например, вы не сможете набирать или видеть тамильские или другие индийские символы в SMS-сообщениях). Кстати, то, что вы предложили, уже упоминалось в основном посте: > «Opera и несколько других браузеров делали это еще до Android 4.0, заменяя изображение вместо символа».

Вам не нужно рутировать и заменять шрифт в системе Android.

Замените прошивку вашего устройства аналогичной прошивкой для индийского региона, чтобы правильно отобразить шрифт Devanagari. Прошивки других регионов неправильно отображают шрифты Devanagari. Шрифты деванагари правильно отображаются на Android версии 2.x в индийском регионе.