2012-01-16 8 views
4

Javaノードは、UTF-8でエンコードされたErlang文字列を受け取ります。クラスの種類はOtpErlangStringです。 .toString()または.stringValue()の場合、結果としてjava.lang.Stringに無効なコードポイントがあります(基本的にErlang文字列の各バイトは別の文字と見なされます)。Erlang UTF-8エンコードされた文字列をjava.lang.Stringに変換します。

Java Stringを作成するときにnew String(bytes, "UTF-8")を使用しますが、OtpErlangStringからバイトを取得する方法はありますか。

+0

んjava.io.StringReaderの助けを? – Reddy

+0

どのように表示されません。それを使用する方法を提案できますか? –

+0

私の間違い私はOtpErlangStringがStringを拡張すると思った。 – Reddy

答えて

1

UTF8文字を使用すると、Java側でOtpErlangStringを取得するのが奇妙です。私はASCII文字のみを使用する場合、私はこのタイプのオブジェクトを取得します。少なくとも1つのUTF8文字を追加すると、結果の型はOtpErlangList(文字列はErlangのintのリストにすぎません)であり、stringValue()メソッドを使用できます。

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

私が受信して、それを印刷::のようにErlangの形式の文字列を送信した後になるように

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

"да"(ロシア語で "yes")という[208,180,208,176]を送信すると、結果は "OtpErlangString"になります。 'OtpErlangList'オブジェクトを強制的に作成するためにリストの前に空のタプルを含めることは素晴らしいですが、より簡単な解決法はありませんか? 'OtpErlangString'オブジェクトからバイナリ配列を抽出する方法はありませんか? –

関連する問題