20

だから私はバイナリを文字列に変換しようとしています。このコード:

t = [{<<71,0,69,0,84,0>>}]
String.from_char_list(t)

しかし、この変換を試みると、次のようになります。

** (ArgumentError) argument error
    (stdlib) :unicode.characters_to_binary([{<<70, 0, 73, 0, 78, 0>>}])
    (elixir) lib/string.ex:1161: String.from_char_list/1

<<70、0 などは書記素のリストである可能性が高いと想定しています (これは API 呼び出しからの戻り値であり、API は十分に文書化されていません) が、何らかの方法でエンコーディングを指定する必要がありますか?

明らかな何かが欠けている可能性が高いことはわかっていますが(おそらくそれは使用するのに適切な機能ではありませんか?)、ここで何をすべきかわかりません。


編集:

参考までに、上記のバイナリは Erlang ODBC 呼び出しの戻り値です。もう少し掘り下げた後、問題のバイナリは実際には「UTF16 リトル エンディアンとしてエンコードされた Unicode バイナリ」であることがわかりました (こちらを参照してください: http://www.erlang.org/doc/apps/odbc/odbc.pdf pg. 9 re: SQL_WVARCHAR) 実際には問題は変わりませんが、コンテキストが追加されます。

4

7 に答える 7

27

ここにはいくつかのことがあります:

1.) 1 つの要素 (バイナリ) を含むタプルのリストがあります。おそらく、バイナリを抽出して文字列を取得できます。現在のデータ構造を に渡すことto_stringはできません。

2.) 例で使用したバイナリには0、印刷できない文字が含まれています。シェルでは、文字列を表すバイナリに印刷できない文字が含まれている場合、Elixir は単なるバイナリと文字列を表すバイナリの違いを区別できないため、これは文字列として適切に印刷されません。

3.) パターン マッチングを使用して、バイナリを特定の型に変換できます。例えば:

iex> raw = <<71,32,69,32,84,32>>
...> Enum.join(for <<c::utf8 <- raw>>, do: <<c::utf8>>)
"G E T "
...> <<c::utf8, _::binary>> = raw
"G"

また、ネットワーク接続からバイナリ データを取得する場合は:erlang.iolist_to_binary、データが charlist ではなく iolist になるため、おそらく を使用することをお勧めします。違いは、iolists は、整数のリストだけでなく、バ​​イナリ、ネストされたリストを含むことができるということです。charlists は、常に整数の単純なリストです。to_stringiolist でを呼び出すと、失敗します。

于 2014-03-19T22:27:53.420 に答える
2

最後のポイントは間違いなく問題を変え、それを説明しています。Elixir はバイナリを文字列として使用しますが、バイナリが UTF16 ではなく UTF8 でエンコードされていることを想定し、要求します。

于 2014-03-21T14:13:33.273 に答える