JDK 8における国際化の拡張機能
JDK 8の国際化の拡張機能には、次のものがあります。
JDK 8リリースには、Unicode 6.2.0のサポートが含まれています。Unicode 6.0をサポートするJDK 7のリリース以降、Unicode 6.1.0および6.2.0の仕様で次の新機能が導入され、JDK 8に追加されています。
- 733個の新しい文字(トルコ・リラ記号など)
- 7つの新しいスクリプト:
- メロエ象形文字
- メロエ文字草書体
- ソラ・ソンペン文字
- チャクマ文字
- シャーラダー文字
- タークリー文字
- ミャオ文字
- 11個の新しいブロック。そのうち7ブロックは前述の新しいスクリプトのもので、4ブロックは次の既存スクリプトのものです。
- アラビア文字拡張A
- スンダ文字補助
- マニプール文字拡張
- アラビア数学用英数字記号
Javaチュートリアルには、Unicodeについて説明するセクションがあります。
Unicode Consortiumは、「もっとも大規模かつ広範な標準ロケール・データ・リポジトリによって世界の言語をサポートする」ために、共通ロケール・データ・リポジトリ(CLDR)プロジェクトをリリースしました。CLDRはロケール・データの事実上の標準となりつつあります。
CLDRのXMLベースのロケール・データはJDK 8リリースに組み込まれていますが、デフォルトでは無効になっています。
現在、ロケール・データには異なる4つのソースがあります。
- CLDRは、Unicode CLDRプロジェクトから提供されるロケール・データを表します。
- HOSTは、基盤となるオペレーティング・システムの設定に対する現在のユーザーによるカスタマイズを表します。これはそのユーザーのデフォルト・ロケールでのみ機能します。カスタマイズ可能な設定はOSによって異なる場合がありますが、主に日付、時間、数値および通貨のフォーマットがサポートされます。
- SPIは、インストールされているSPIプロバイダに実装されている、ロケールに依存するサービスを表します。
- JREは、以前のJREリリースと互換性のあるロケール・データを表します。
使用するロケール・データ・ソースを選択するには、java.locale.providersシステム・プロパティを使用して、データ・ソースを優先順に並べます。たとえば、
java.locale.providers=HOST,SPI,CLDR,JRE
デフォルトの動作は次の設定と同等です。
java.locale.providers=JRE,SPI
詳細については、API仕様のページのjava.util.spi.LocaleServiceProviderおよびJDK 8とJRE 8でサポートされているロケールに関するページを参照してください。このページはOracle JDK 8のリリース後に使用可能になります。
Unicode共通ロケール・データ・リポジトリ(CLDR)プロジェクトの進展に伴い、Java SE APIは更新されます。JDK 8リリースでは、2つの新規クラスといくつかの新規メソッドが追加され、既存のstaticメソッドに新しい戻り値が追加されました。
- DecimalFormatSymbols.getInstance(Locale) staticメソッドは、数体系としてLocale.UNICODE_LOCALE_EXTENSIONを認識できるようになりました。
- サービス・プロバイダ用の新しい2つの抽象クラスがjava.util.spiパッケージに追加されました。CalendarDataProvider抽象クラスは、ローカライズされた週パラメータを提供します。CalendarNameProvider抽象クラスは、カレンダの名前を表示するためのフィールド値名を提供します。このクラスでは、次のカレンダ・タイプ文字列が認識されます。
- "gregory" - グレゴリオ暦とユリウス暦のハイブリッド
- "buddhist" - タイ仏暦
- "japanese" - 和暦
- 新しいLocaleServiceProvider.html#isSupportedLocale(Locale)メソッドは、指定されたロケールがロケール・サービス・プロバイダでサポートされている場合にtrueを返します。
- 新しいCalendar.getCalendarType()メソッドは、カレンダ・タイプ文字列("gregory"、"buddhist"、"japanese")を返します。
- Calendar.getDisplayNameメソッドとCalendar.getDisplayNamesメソッドで使用される新しいスタイル指示子は、Calendarの名前のフォーマットを判定します。
- 新しい2つのLocaleメソッドは、ロケールの(オプションの)拡張を処理します。
詳細は、JavaチュートリアルのBCP 47拡張に関するレッスンを参照してください。
- 新しいLocale.filterメソッドは、RFC 4647の定義に従って、指定された条件に一致するLocaleインスタンスのリストを返します。
- 新しい2つのLocale.filterTagsメソッドは、RFC 4647の定義に従って、指定された条件に一致する言語タグのリストを返します。
- 新しい2つのlookupメソッドは、RFC 4647に定義されているルックアップ・メカニズムを使用して、もっともよく一致するロケールまたは言語タグを返します。
JDK 8では、サービス・プロバイダ・インタフェース(SPI)であるjava.util.spi.ResourceBundleControlProvider
インタフェースが導入されました。SPIを使用すると、拡張可能なアプリケーションを作成できます。このようなアプリケーションは、元のコード・ベースを変更せずに簡単に拡張できます。このSPIを使用すると、メソッドResourceBundle getBundle(String baseName, Locale targetLocale)
でのリソース・バンドルのロード方法を変更できます。このメソッドはResourceBundle.Control
クラスのインスタンスを必要としません。ResourceBundleControlProvider
SPIの実装がインストールされると、デフォルトのResourceBundle.Control
クラスが置き換えられます。これは、デフォルトのバンドル・ロード処理を定義します。詳細は、カスタム・リソース・バンドルを拡張機能としてインストールする方法に関するトピックを参照してください。