След: Интернационализация
Урок: Работа с текстом
Преобразование латинских Цифр к Другим Цифрам Unicode
Домашняя страница > Интернационализация > Работа с текстом

Преобразование латинских Цифр к Другим Цифрам Unicode

По умолчанию, когда текст содержит числовые значения, те значения выводятся на экран, используя латинские (европейские) цифры. Когда другие формы цифры Unicode предпочитаются, используйте java.awt.font.NumericShaper class. NumericShaper API позволяет Вам вывести на экран числовое значение, представленное внутренне как значение ASCII в любой форме цифры Unicode.

Следующий фрагмент кода, от ArabicDigits пример, шоу, как использовать a NumericShaper экземпляр, чтобы преобразовать латинские цифры в арабские цифры. Строка, которая определяет действие формирования, является полужирной.

ArabicDigitsPanel(String fontname) {
    HashMap map = new HashMap();
    Font font = new Font(fontname, Font.PLAIN, 60);
    map.put(TextAttribute.FONT, font);
    map.put(TextAttribute.NUMERIC_SHAPING,
        NumericShaper.getShaper(NumericShaper.ARABIC));

    FontRenderContext frc = new FontRenderContext(null, false, false);
    layout = new TextLayout(text, map, frc);
}

// ...

public void paint(Graphics g) {
    Graphics2D g2d = (Graphics2D)g;
    layout.draw(g2d, 10, 50);
}

NumericShaper экземпляр для арабских цифр выбирается и помещается в a HashMap для TextLayout.NUMERIC_SHAPING ключ атрибута. Карту хеша передают к TextLayout экземпляр. После рендеринга текста в paint метод, цифры выводятся на экран в требуемом сценарии. В этом примере латинские цифры, 0 до 9, оттягиваются как арабские цифры.

Вывод ArabicDigits в качестве примера, показывая арабские цифры от 0 до 9

Предыдущий пример использует NumericShaper.ARABIC постоянный, чтобы получить требуемый формирователь, но NumericShaper class обеспечивает константы для многих языков. Эти константы определяются как битовые маски и упоминаются как NumericShaper основанные на битовой маске константы.

Основанные на перечислении Константы Диапазона

Альтернативный способ определить определенный набор цифр состоит в том, чтобы использовать NumericShaper.Range перечислимый тип (перечисление). Это перечисление, представленное в Java SE 7 выпусков, также обеспечивает ряд констант. Хотя эти константы определяются, используя различные механизмы, NumericShaper.ARABIC битовая маска функционально эквивалентна NumericShaper.Range.ARABIC перечисление, и есть соответствие getShaper метод для каждого постоянного типа:

ArabicDigitsEnum пример идентичен примеру ArabicDigits, кроме этого использует NumericShaper.Range перечисление, чтобы определить сценарий языка:

ArabicDigitsEnumPanel(String fontname) {
    HashMap map = new HashMap();
    Font font = new Font(fontname, Font.PLAIN, 60);
    map.put(TextAttribute.FONT, font);
    map.put(TextAttribute.NUMERIC_SHAPING,
        NumericShaper.getShaper(NumericShaper.Range.ARABIC));
    FontRenderContext frc = new FontRenderContext(null, false, false);
    layout = new TextLayout(text, map, frc);
}

Оба getShaper методы принимают a singleRange параметр. С любым постоянным типом можно определить диапазон специфичных для сценария цифр. Основанные на битовой маске константы могут быть объединены, используя OR операнд, или можно создать ряд NumericShaper.Range перечисления. Следующие шоу, как определить диапазон, используя каждый постоянный тип:

NumericShaper.MONGOLIAN | NumericShaper.THAI |
NumericShaper.TIBETAN
EnumSet.of(
    NumericShaper.Range.MONGOLIAN,
    NumericShaper.Range.THAI,
    NumericShaper.Range.TIBETAN)

Можно запросить NumericShaper объект определить, какие диапазоны это поддерживает использование любого getRanges метод для основанных на битовой маске формирователей или getRangeSet метод для основанных на перечислении формирователей.


Отметьте: 

Можно использовать или традиционный бит замаскированные на основе константы или Range основанные на перечислении константы. Вот некоторые соображения, решая, чтобы использовать:

  • Range API требует JDK 7 или позже.
  • Range API покрывает больше диапазонов Unicode чем замаскированный битом API.
  • API битовой маски немного быстрее чем Range API.

Рендеринг Цифр Согласно Контексту Языка

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

Можно выполнить это использование одного из getContextualShaper методы:

Первые два метода используют константы битовой маски, и последние два используют перечислимые константы. Методы, которые принимают a defaultContext параметр позволяет Вам определить начальный формирователь, который используется, когда числовые значения выводятся на экран перед текстом. Когда никакой контекст значения по умолчанию не определяется, любые ведущие цифры выводятся на экран, используя латинские формы.

ShapedDigits пример показывает, как работают формирователи. Пять текстовых разметок выводятся на экран:

  1. Первое расположение не использует формирователя; все цифры выводятся на экран как латынь.
  2. Второе расположение формирует все цифры как арабские цифры, независимо от контекста языка.
  3. Третье расположение использует контекстный формирователь, который использует арабские цифры. Контекст значения по умолчанию определяется, чтобы быть арабским.
  4. Четвертое расположение использует контекстный формирователь, который использует арабские цифры, но формирователь не определяет контекст значения по умолчанию.
  5. Пятое расположение использует контекстный формирователь, который использует ALL_RANGES битовая маска, но формирователь не определяет контекст значения по умолчанию.
Вывод ShapedDigits в качестве примера, иллюстрирующий, как работают контекстные формирователи

Следующие строки кода показывают, как формирователи, если использующийся, определяются:

  1. Никакой формирователь не используется.
  2. NumericShaper arabic = NumericShaper.getShaper(NumericShaper.ARABIC);
  3. NumericShaper contextualArabic = NumericShaper.getContextualShaper(NumericShaper.ARABIC, NumericShaper.ARABIC);
  4. NumericShaper contextualArabicASCII = NumericShaper.getContextualShaper(NumericShaper.ARABIC);
  5. NumericShaper contextualAll = NumericShaper.getContextualShaper(NumericShaper.ALL_RANGES);

См. ShapedDigits.java пример для дальнейших деталей реализации.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Границы Строки
Следующая страница: Преобразование текста неUnicode



Spec-Zone.ru - all specs in one place