JavaOne Japan 2001


発表資料


BOF-18の質疑応答

Q. CharSequenceクラスのlengthメソッドはUnicodeの文字数を返しますが、実際の文字数を返すメソッドはありますか?

A. 特にないので、BreakIteratorクラスを使って文字数を計算してください。 なお、Unicode Consortiumでは文字エンコーディングを5種類に分類しています (参照: Character Encoding Model) が、Javaでは、この中のCoded Character Setレベルで走査するIteratorは定義されていません。 必要があれば追加を検討してもよいかもしれませんので、教えてください。

Q. 文字列の内部表現がUTF-16に変更されるということですが、クラスファイル内の表現やUnicodeエスケープ("\uNNNN")は変更されますか?

A. 現時点では特に議論していませんので、このままかもしれません。 クラスファイルに関しては、互換性を保つために変更しなくても仕方ない点もあるのですが、Unicodeエスケープについては、プログラマがUTF-16に変換して記述するのは面倒ですので、確認します。

Q. Stringのコンストラクタには意図的にcharset関連クラスを追加しなかったそうですが、逆に既存のコンストラクタがdeprecatedになるのですか?

A. その予定はありません。

Q. "+"演算子を用いた文字列の連結には、1.4でもStringBufferが使用されるのですか?

A. CharBufferクラスはStringBufferクラスのように自動的に拡張されないので、変更はないと思います。

Q. MS932コンバータとSJISコンバータのマッピングが異なる問題はどうなりましたか?

A. JSR-51はNew I/O APIの策定が目的であり、基本的には実際の実装を議論する場ではないので、この問題については話し合うことはできませんでした。 ただし、実装に関してはSpecification Lead (実装の責任者でもある)に直接相談してよいということだったので、それに関する要求をすでに2度メールで要求したのですが、多忙らしく返事が来ません。 J2SE 1.4b3を調べたところ、まだ解決されていないようです。

Q. MS932コンバータとSJISコンバータのマッピングが異なる問題はどのようにすればよいですか?

A. IANAで定義されている文字集合名(charset)では、本来はSJISコンバータがShift_JISに、MS932コンバータがWindows-31Jに相当します。 推奨MIME名を用いる必要のないアプリケーションでは、MS932コンバータとSJISコンバータをプログラム中で明示的に指定して使い分けることができますが、JavaServer Pages, Servlet API, XMLなどでは、推奨MIME名のcharset指定だけが有効であり、開発者がこの問題を回避することは非常に困難です。 これはMS932コンバータを追加する時に、Windows-31JだけでなくShift_JISも割り当ててしまったのが原因ですが、この間違った関連づけを解消する必要があると思います。

Q. Shift_JISをMS932コンバータからSJISコンバータに割り当て直した場合に、既存のアプリケーションで問題が発生しませんか?

A. デフォルトの文字エンコーディングは変更されないので、明示的にコンバータを指定していないアプリケーションでは問題は発生しません。 ただし、MS932コンバータを使用したいのにもかかわらずcharsetにShift_JISを指定しているアプリケーションやデータでは異なるコードポイントに変換されることになるので、文字化けなどの問題が発生することがあります。 この場合には、プログラムやデータ中のcharset指定を、Shift_JISからWindows-31Jに変更する必要があります。 結局、問題は今のままでも、移行しても生じます。 しかし、同じ問題が生じるのなら、移行時に一時的なコストが掛ったとしても、将来的に問題が解消されるようにすべきでしょう。

Q. J2SE 1.3でMS932コンバータを使用したい場合には、最初からWindows-31Jと指定しておけばよいのでしょうか?

A. それでよいと思います。

Q. New I/Oに関してフィードバックしたい場合は、どうすればよいですか?

A. jsr-51-comments@jcp.orgに報告してください。 もちろん、私に直接報告していただいてもよいのですが、できれば正式に報告していただいた方が、Specification Leadや他のエキスパートにも重要性を認識してもらえると思います。

注: BOFの回答を、より正確に書き直してあります。 また、質問時間が終わったあとに受けた質問についても書いてあります。


参考資料

  1. JSR-51: New I/O API for the Java Platform, http://jcp.org/jsr/detail/051.jsp
  2. J2SE 1.4: New I/O APIs, http://java.sun.com/j2se/1.4/docs/guide/nio/
  3. Mark Davis: Unicode Regular Expression Guidelines, Unicode Technical Report #18, http://www.unicode.org/unicode/reports/tr18/
  4. Ken Whistler, Mark Davis: Character Encoding Model, Unicode Technical Report #17, http://www.unicode.org/unicode/reports/tr17/
  5. Kazuhiro Kazama: UTF-16 Support in Java, http://www.ingrid.org/java/i18n/utf-16/, 2000.
  6. IANA: CHARACTER SETS, http://www.iana.org/assignments/character-sets