将Erlang UTF-8编码的字符串转换为java.lang.String

时间:2012-01-16 10:01:01

标签: java unicode utf-8 erlang jinterface

Java节点接收以UTF-8编码的Erlang字符串。它的类类型是OtpErlangString。如果我只是执行.toString().stringValue(),则生成的java.lang.String具有无效的代码点(基本上,Erlang字符串中的每个字节都被视为不同的字符)。

现在,我想在创建Java String时使用new String(bytes, "UTF-8")但是如何从OtpErlangString获取字节?

1 个答案:

答案 0 :(得分:1)

当您使用UTF8字符时,在Java端获得OtpErlangString很奇怪。如果我只使用ASCII字符,我会得到这种类型的对象。如果我添加至少一个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());