Японские иероглифы на Android выглядят как китайцы - PullRequest
24 голосов
/ 21 сентября 2011

PREAMBLE: начиная с API 17 (Android 4.2), существует метод TextView.setTextLocale(), который явно решает эту проблему для TextViews и производных классов. Назначьте японскую локаль (Locale.JAPAN), и символы Unihan будут выглядеть японскими.


У меня есть приложение на Android, которое отображает японский текст в WebViews и TextViews. Есть некоторые китайские иероглифы (кандзи), которые по соглашению выглядят по-разному в Китае и в Японии, но имеют одинаковую кодовую точку Unicode. Обычно браузер полагается на тег lang, чтобы выбрать правильный глиф. В Android все они по умолчанию имеют китайские фигуры, а я хочу японские фигуры.

Проблема хорошо объяснена в этой статье . Эта статья также служит прекрасной иллюстрацией проблемы - при просмотре на Android (до 2.2) все символы в «Примерах символов, зависящих от языка» выглядят одинаково, и на китайском.

Использование атрибута lang="ja" не помогает. Переключение всей локали системы на японский также не помогает.

Мне интересно, какие телефоны Android продаются в Японии. Выглядят ли такие персонажи, как 直, Chinese, Chinese в китайском стиле? Я предполагаю, что нет.

Итак, вопросы: существуют ли официальные локализованные изображения Android? Могу ли я получить один для запуска на эмуляторе? Является ли шрифт DroidSansFallback по-прежнему единственным шрифтом с поддержкой CJK? И если да, то такой же, как на ванильном Android США?

Я надеюсь, что японские глифы спрятаны где-то глубоко в шрифте (приватная область Юникода или что-то в этом роде). Если так, я мог бы использовать их ...

РЕДАКТИРОВАТЬ: находится DroidSansJapanese.ttf, установил его на эмуляторе, скопировав в / system / fonts, перезапустил. Не имеет значения внешний вид статьи Unihan. Даже область подсказок при вводе текста на японском языке (которая должна быть лучше знакома) отображается так, как если бы она была на китайском.

Как узнать имя гарнитуры DroidSansJapanese.ttf? У меня такое ощущение, что это все еще Droid Sans, такой же, как во встроенном шрифте DroidSansFallback. Но если они содержат одинаковую гарнитуру, что определяет, какой из них должен иметь приоритет? Казалось бы - система локали, но, видимо, нет. Шрифты в Android устанавливаются только копированием, верно?

Ответы [ 3 ]

4 голосов
/ 23 сентября 2011

Есть шрифты с полной поддержкой японского языка. Я слышал, как некоторые люди говорили о DroidSansJapanese.tff и TakaoPGothic.

4 голосов
/ 22 сентября 2011

Нашел несколько грязное решение.

Шрифт DroidSansJapanese.ttf существует и доступен для загрузки, например, здесь . Я загрузил его, переименовал в DroidSansJapanese.mp3, чтобы избежать ограничения на сжатые ресурсы в 1 МБ, и поместил его в assets/web. Затем я ввел следующее утверждение CSS:

@font-face
{
font-family: "DroidJP";
src:url('DroidSansJapanese.mp3')
}

Затем я добавил 'DroidJP' к font-family каждого соответствующего стиля CSS. Как я загружаю свой HTML, папка assets/web уже обозначена как база для загрузки связанного контента.

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

Typeface s_JFont =
    Typeface.createFromAsset(Ctxt.getAssets(), "web/DroidSansJapanese.mp3");

и вызывается setTypeface() в каждом соответствующем TextView. Теперь для прибыли!

Это расширило мой APK примерно на 1 МБ. Был альтернативный способ, когда я сохранял шрифт в активах в сжатом виде - это сэкономило бы мне около 500 КБ размера APK, но потом мне пришлось бы расширять его до памяти телефона при первом запуске. о пути к папке с данными, и потерять совместимость с Android 1.5.

Некоторая сумма кредита: здесь и здесь . Не работает на Android 2.1 (WebViews, а не TextViews) - это известная ошибка .

Теперь остается вопрос - как определить устройства, в которых шрифт по умолчанию уже содержит японские фигуры?

РЕДАКТИРОВАТЬ re: mp3 взломать. Сначала я реализовал решение chunked, но затем решил использовать шрифт в активах. Подход с использованием чанков имеет один плюс - меньший размер APK - и следующие недостатки:

  • Потребляет больше памяти телефона - в итоге вы сохраняете сжатый шрифт в активах и несжатый в каталоге данных
  • Несовместимо с Android 1.5 на стороне TextView - метод Typeface.createFromFile() был представлен на уровне API 4
  • Сложная генерация HTML - CSS с объявлением @ font-face необходимо параметризировать, поскольку путь к данным является переменной
  • Замедляет запуск первого приложения - вы тратите время на объединение фрагментов

Хранение шрифта в качестве сжатого ресурса также не подходит - тогда шрифт не отображается в WebView, и в LogCat отчетливо видно сообщение «Данные превышают UNCOMPRESS_DATA_MAX».

0 голосов
/ 04 ноября 2018

Используя следующее в вашем onCreate / OnCreateView:

AssetManager am = getContext().getApplicationContext().getAssets();
mDroidSansJapaneseTypeface = Typeface.createFromAsset(am, String.format(Locale.JAPAN, "fonts/%s", "DroidSansJapanese.ttf")); //I put the font file in the assets/fonts/ folder

И затем для ваших текстовых обзоров:

myTextView.setTypeface(mDroidSansJapaneseTypeface);
myTextView.setTextLocale(Locale.JAPAN);

Имейте в виду, что не 100% всех шрифтов будут отображаться в Android,Я не видел слишком много проблем для японских символов, но другие символы CJK могут отображаться как пустые поля, независимо от того, какой файл ttf вы используете.

...