JavaFXのWebViewに文字列を出そうとした時に大抵の日本語は出るのだが、絵文字&他にも一部の文字(𠮷とか 𩸽とか)が出ない問題が起きた。
Javaの内部ではUTF-16で扱っていて、UTF-8にする時にサロゲートペアで扱われている文字がおかしくなるようだ。
HTMLには数値文字参照という文字のコードポイントを直接指定して文字を出す機能がある。
(書き方は&#x{16進};
または &#{10進};
)
例えば HTML上に💯
とかくと💯になる。
この機能を使い、以下のコードでHTMLに出力される文字列が数値文字参照になるようにして解決した。
String toCharacterReference(String str) {
int len = str.length();
int[] codePointArray = new int[str.codePointCount(0, len)];
for (int i = 0, num = 0; i < len; i = str.offsetByCodePoints(i, 1)) {
codePointArray[num] = str.codePointAt(i);
num += 1;
}
StringBuffer stringBuffer = new StringBuffer();
for (int value : codePointArray) stringBuffer.append("&#x" + (Integer.toHexString(value)) + ";");
return stringBuffer.toString();
}