4

Java ノードは、UTF-8 でエンコードされた Erlang 文字列を受け取ります。そのクラス タイプはOtpErlangString. 私が単純に行う.toString().stringValue()、結果java.lang.Stringに無効なコードポイントがある場合 (基本的に、Erlang 文字列のすべてのバイトは別個の文字と見なされます)。

今、私new String(bytes, "UTF-8")はJava文字列を作成するときに使用したいのですが、どのようにバイトを取得するのOtpErlangStringですか?

4

1 に答える 1

1

UTF8 文字を使用すると、Java 側で OtpErlangString を取得するのは奇妙です。ASCII 文字のみを使用すると、このタイプのオブジェクトが得られます。少なくとも 1 つの UTF8 文字を追加すると、結果の型は OtpErlangList (Erlang では文字列は単なる int のリストであるため、これは論理的です) になり、その 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());
于 2012-01-19T07:51:23.370 に答える