Преобразовать строку в кодировке Erlang UTF-8 в java.lang.String

Узел Java получает строку Erlang, закодированную в UTF-8. Его тип класса OtpErlangString, Если я просто сделаю .toString() или же .stringValue() результирующий java.lang.String имеет недопустимые кодовые точки (в основном каждый байт из строки Erlang считается отдельным символом).

Теперь я хочу использовать new String(bytes, "UTF-8") при создании строки Java, но как получить байты из OtpErlangString?

1 ответ

Странно, что вы получаете 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());
Другие вопросы по тегам