• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JTextComponentでサロゲートペアのテスト
#navi(../)
RIGHT:Posted by [[aterai]] at 2012-05-14
*JTextComponentでサロゲートペアのテスト [#i662a528]
JEditorPaneなどで数値文字参照やUnicodeエスケープを使ってサロゲートペアのテストをします。

-&jnlp;
-&jar;
-&zip;

//#screenshot
#ref(https://lh5.googleusercontent.com/-BY6N3kDDUG8/T7ByWIn0mgI/AAAAAAAABMo/4dpU-rm8zAQ/s800/SurrogatePair.png)

**サンプルコード [#x2ef8e44]
#code{{
final URL url = getClass().getResource("SurrogatePair.html");
try{
  editor1.read(new InputStreamReader(url.openStream(), "UTF-8"), "html");
}catch(Exception ex) {
  editor1.setText("<html><p>(&#xD85B;&#xDE40;) (&#x26E40;)<br />(&#xD842;&#xDF9F;) (&#x00020B9F;)</p></html>");
}

JEditorPane editor2 = new JEditorPane();
//editor2.setFont(new Font("IPAexGothic", Font.PLAIN, 24));
editor2.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, Boolean.TRUE);
editor2.setText("(\uD85B\uDE40) (\u26E40)\n(\uD842\uDF9F) (\u20B9F)");
}}

**解説 [#db4b4e56]
以下、サロゲートペア対応フォントを使えるようにしてテストしています。Java Web Start で起動した場合、"browse"ボタンでSurrogatePair.htmlを表示することはできません。

-上: 数値文字参照(Numeric character reference)
-- JEditorPane(HTMLEditorKit)の場合
 JEditorPane OK: &#xD85B;&#xDE40;
 JEditorPane NG: &#x26E40;

-- ブラウザ(試したのはIE, FireFox, Chrome, Opera)の場合
 Browser NG: &#xD85B;&#xDE40;
 Browser OK: &#x26E40;

-下: Unicodeエスケープ(Unicode escapes)
 JEditorPane OK: \uD85B\uDE40
 JEditorPane NG: \u26E40

----
JTextComponentとブラウザでサロゲートペアの表現が異なるようなので、これらの文字をどちらの環境でも正しく表示したい場合は、数値文字参照やUnicodeエスケープは使用せず、ソースコードなどをUTF-8にしてそのまま𦹀や𠮟と書く((メモ帳などの対応済みエディタで))のがよさそうです。

----
Windows7, JDK 1.7.0_02 の環境では、JTextComponentからメモ帳などにサロゲートペアの文字をコピーペーストは可能ですが、逆にメモ帳やブラウザからJTextComponentにサロゲートペアの文字をコピーペーストすることができないようです。

----
現状ではJTextComponentは、異体字セレクタに対応していない?
- フォントをIVS(Adobe-Japan1-6)に対応している小塚明朝 Pr6N や IPAex明朝 などに変更して、数値文字参照、Unicodeエスケープを使っても下駄になったり、ソースコードをUTF-8にしても%%以下のような IllegalArgumentException が発生するようです。%%

 Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Length must be >= 0.
    at javax.swing.text.GlyphPainter2.getBoundedPosition(GlyphPainter2.java: 205)

- IllegalArgumentExceptionと異体字セレクタは関係なくて、Windows環境のJavaと'小塚明朝 Pr6N R'(OTFフォントだから?) と相性が悪いだけ?
- IllegalArgumentExceptionと異体字セレクタは関係なくて、Windows環境のJavaと'小塚明朝 Pr6N R'(OTFフォントだから?)と相性が悪いだけ?
- Font.createFont(...)で、C:\Program Files (x86)\Adobe\Acrobat 9.0\Resource\CIDFont\KozMinPr6N-Regular.otf からフォントを作ると???

//**参考リンク
**コメント [#qfcd8f76]
#comment