Странно, что вы получаете OtpErlangString на стороне Java, когда используете символы UTF8. Я получаю объект этого типа, если я использую только символы ASCII. Если я добавлю хотя бы один символ UTF8, результирующий тип будет OtpErlangList (что логично, поскольку строки - это просто списки целых чисел в Erlang), а затем я могу использовать его метод stringValue (). Так что после отправки строковой формы Erlang вроде:
(waco@host)8> {proc, java1@host} ! "ąćśźżęółńa".
[261,263,347,378,380,281,243,322,324,97]
На узле Java я получаю и распечатываю его:
OtpErlangList l = (OtpErlangList) mbox.receive();
System.out.println(l.stringValue());
Вывод правильный:
ąćśźżęółńa
Однако, если это не так в вашей ситуации, вы можете попытаться обойти это, форсируя представление OtpErlangList, например, например. добавление пустого кортежа в качестве самого первого элемента списка строк:
(waco@wborowiec)11> {proc, java1@wborowiec} ! [{}] ++ "ąćśźżęółńa".
[{},261,263,347,378,380,281,243,322,324,97]
А на стороне Java что-то вроде:
OtpErlangList l = (OtpErlangList) mbox.receive();
// get rid of an extra tuple
OtpErlangObject[] strArr = Arrays.copyOfRange(l.elements(), 1, l.elements().length);
OtpErlangList l2 = new OtpErlangList(strArr);
System.out.println(l2.stringValue());