NumericShaper 클래스

NumericShaper 클래스

NumericShaper 클래스는 Latin-1(유럽) 숫자를 다른 유니코드 십진 숫자로 변환하는 데 사용해요. 주 사용자는 데이터를 내부적으로는 Latin-1(유럽) 숫자로 표현하지만, 표시할 때는 국가별 숫자 모양을 쓰고 싶은 사람들이에요. 이 클래스는 폐기된 숫자 모양 선택 문자(U+206E)를 해석하지 않아요.

출처: Java API Reference

본문

NumericShaper 인스턴스는 보통 TextAttribute 클래스의 NUMERIC_SHAPING 속성으로 텍스트에 적용돼요. 예를 들어 다음 코드는 아랍어 문맥에서 유럽 숫자를 아랍어 숫자로 변형하게 해요.

public final class NumericShaper
extends Object
implements Serializable
Map map = new HashMap();
map.put(TextAttribute.NUMERIC_SHAPING, NumericShaper.getContextualShaper(NumericShaper.ARABIC));
FontRenderContext frc = ...;
TextLayout layout = new TextLayout(text, map, frc);
layout.draw(g2d, x, y);

NumericShaper 인스턴스를 사용해 명시적으로 숫자 변형을 수행할 수도 있어요.

char[] text = ...;
// 모든 EUROPEAN 숫자(0 제외)를 ARABIC 숫자로 변형
NumericShaper shaper = NumericShaper.getShaper(NumericShaper.ARABIC);
shaper.shape(text, start, count);

// 앞 텍스트가 아랍어면 EUROPEAN 숫자를 ARABIC으로,
// 앞 텍스트가 타밀어면 TAMIL 숫자로,
// 앞 텍스트가 없거나 아랍어·타밀어도 아니면 그대로 둠
NumericShaper shaper = NumericShaper.getContextualShaper(NumericShaper.ARABIC | NumericShaper.TAMIL, NumericShaper.EUROPEAN);
shaper.shape(text, start, count);

비트 마스크·enum 기반 유니코드 범위

이 클래스는 스크립트별 숫자의 유니코드 범위를 나타내는 두 가지 프로그래밍 인터페이스를 지원해요. NumericShaper.ARABIC 같은 비트 마스크 기반 상수와 NumericShaper.Range.ARABIC 같은 enum 기반 상수가 있어요. 여러 범위는 비트 마스크 상수를 OR(NumericShaper.ARABIC | NumericShaper.TAMIL)하거나 EnumSet.of(NumericShaper.Range.ARABIC, NumericShaper.Range.TAMIL)처럼 Set으로 만들 수 있어요.

enum 기반 범위는 비트 마스크 기반 범위의 상위 집합이에요. 두 인터페이스를 섞으면(직렬화 포함) 매핑 가능한 유니코드 범위 값은 대응되는 값으로 매핑돼요. 매핑할 수 없는 범위(예: NumericShaper.Range.BALINESE)가 지정되면 그 범위는 무시돼요.

십진 숫자 우선순위

한 유니코드 범위에 여러 십진 숫자 집합이 있을 수 있어요. 같은 범위에 여러 숫자 집합이 지정되면 한 집합이 우선해요. 예를 들어 아랍어의 경우 EASTERN_ARABICARABIC보다 우선하고, 타이탐(Tai Tham)의 경우 TAI_THAM_THAMTAI_THAM_HORA보다 우선해요.

팩토리 메서드

  • getShaper(int ranges) — 지정한 범위로 숫자를 변형하는 shaper를 만들어요.
  • getContextualShaper(int ranges) — 주변 문맥에 따라 변형할 범위를 선택하는 shaper를 만들어요.
  • getContextualShaper(int ranges, int defaultContext) — 주변 문맥에 따라 변형을 결정하되 기본 문맥을 지정해요.
  • shape(char[], int start, int count) — 지정한 문자 배열을 변형해요.
  • shape(char[], int start, int count, int context) — 문맥을 지정해 배열을 변형해요.

더 알아보기