2012-01-16 2 views
4

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

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

+0

ли java.io.StringReader помочь? – Reddy

+0

Я не вижу, как. Можете ли вы предложить способ его использования? –

+0

моя ошибка Я думал, что OtpErlangString расширяет String. – Reddy

ответ

1

Странно, что вы используете OtpErlangString на стороне Java, когда используете символы UTF8. Я получаю объект этого типа, если я использую только символы ASCII. Если я добавлю хотя бы один символ UTF8, результирующим типом будет OtpErlangList (что логично, поскольку строки являются только списками ints в Erlang), а затем я могу использовать его метод stringValue(). Так что после отправки строки формы Erlang как:

([email protected])8> {proc, [email protected]} ! "ąćśźżęółńa". 
[261,263,347,378,380,281,243,322,324,97] 

На Java узел я получаю и распечатать его:

OtpErlangList l = (OtpErlangList) mbox.receive(); 
System.out.println(l.stringValue()); 

Выход правильно:

ąćśźżęółńa 

Однако, если его не случай в вашей ситуации, вы можете попытаться его обработать, выставив представление OtpErlangList, например добавление пустого кортежа в качестве первого элемента списка строк:

([email protected])11> {proc, [email protected]} ! [{}] ++ "ąćśźżęółń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()); 
+0

Отправка [208, 180, 208, 176], которая является «да» («да» на русском языке) приводит к «OtpErlangString». Чтобы добавить пустой кортеж перед списком, чтобы заставить объект «OtpErlangList» отлично, но не существует ли более легкое решение? Не существует способа извлечь двоичный массив из объекта «OtpErlangString»? –

 Смежные вопросы

  • Нет связанных вопросов^_^