【问题标题】:Convert Erlang UTF-8 encoded string to java.lang.String将 Erlang UTF-8 编码字符串转换为 java.lang.String
【发布时间】:2012-01-16 10:01:00
【问题描述】:

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

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

【问题讨论】:

  • java.io.StringReader 有帮助吗?
  • 我不知道怎么做。你能推荐一种使用它的方法吗?
  • 我的错误,我认为 OtpErlangString 扩展了 String。
  • 我不知道它是否有帮助,但是有 encode() 方法写入 OtpOutputstream,它扩展了 ByteArrayOutputStream。这个 ByteArrayOutputStream 有 toString 方法,应该可以用这个方法。
  • encode() 用于将字符串转换为等效的 Erlang 外部表示。我不应该将它用于此目的。

标签: java unicode utf-8 erlang jinterface


【解决方案1】:

当你使用 UTF8 字符时,你在 Java 端得到 OtpErlangString 很奇怪。如果我只使用 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());

【讨论】:

  • 发送 [208, 180, 208, 176] 是“да”(俄语中的“yes”)会产生OtpErlangString。在列表前面包含一个空元组以强制创建 OtpErlangList 对象很好,但没有更简单的解决方案吗?没有办法从OtpErlangString对象中提取二进制数组吗?
猜你喜欢
  • 2011-12-08
  • 2011-05-20
  • 1970-01-01
  • 2013-07-01
  • 1970-01-01
  • 2011-08-16
  • 2016-10-01
  • 1970-01-01
相关资源
最近更新 更多