Issue #15931 has been updated by arton (Akio Tajima).


提案者です。議論ありがとうございます。
過去のRubyのバージョンのサポートも必要なのでブリッジ自身でもUTF-8とCESU-8の相互変換は行います。その意味ではencodeメソッドは必ずしも必要ありません(当方の認識不足もあって、最初にイッシューを登録したときとは多少状況が変わっています)。
しかし、ユーザーが与えたStringのエンコードがUTF-8の場合、ブリッジとしては\u10000以上の文字が含まれているかどうかの判定に文字列の全舐めが必要です。また必要であればCESU-8への変換処理が必要となります。これらの判定と変換は当然オーバーヘッドです。
もしユーザーが\u10000未満の文字しか利用しないことを知っていれば、あらかじめ文字列のencodingにCESU-8を指定することで、ブリッジは上記のオーバーヘッドなしで指定された文字列をJavaに与えることが可能となります。この場合、ブリッジに与える直前にforce_encoding('CESU-8')としても良いので、その意味ではdummyではだめか? と言われると問題ないとも思います。
逆方向のJavaから受け取った文字列については現状、すべてUTF-8としているので、こちらについてはCESU-8を与えることはないと思います。
提案当初は、Java→Ruby方向についてはオーバーヘッドが無いことからCESU-8のままユーザーへ与えることを想定したのですが、過去のバージョンのことを考えると、変換処理を記述する必要性に変わりなく、であればUTF-8にするほうがリーズナブルだという結論となったので、この点はこちらの考えが変わったので申し訳ない。




----------------------------------------
Feature #15931: encoding for CESU-8
https://bugs.ruby-lang.org/issues/15931#change-80346

* Author: arton (Akio Tajima)
* Status: Open
* Priority: Normal
* Assignee: naruse (Yui NARUSE)
* Target version: 2.7
----------------------------------------
RubyとJavaのブリッジを開発していて、文字列の変換処理で困っています。
現象)
JavaのUTF-8は非標準的な形式 (https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/types.html#modified_utf_8_strings) なので、Ruby側の文字列をそのままUTF-8にエンコードして与えると、Java側ではサロゲートペアに相当する文字を正しく認識できません。
お願い)
Java固有の拡張UTF-8は一般性が欠けていると考えられますが、ほぼ互換のCESU-8 (https://www.unicode.org/reports/tr26/tr26-4.html) は、IANAの文字セットにも登録されていて通信などでそれなりに利用されているようなので、RubyのEncodingでサポートしていただきたいと思います。

よろしくご検討ください。



-- 
https://bugs.ruby-lang.org/