Преобразовать строку в кодировке Erlang UTF-8 в java.lang.String - PullRequest
4 голосов
/ 16 января 2012

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

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

1 Ответ

1 голос
/ 19 января 2012

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