1

Erlang ライブラリ "unicode"を使用して、UTF-8 文字列を Unicode (コード ポイント) リストに変換しようとしています。次のコードを実行しているとき:

1> unicode:characters_to_list(<<208,144,208,145,208,146>>,utf8).
[1040,1041,1042]

正しい値を返しますが、次のとおりです。

2> unicode:characters_to_list([208,144,208,145,208,146],utf8).  
[208,144,208,145,208,146]

ではない。なぜそれが起こるのですか?私が仕様を読んだように、入力データはバイナリまたは文字のリストのいずれかである可能性があるため、私はすべて正しくやっています。

4

2 に答える 2

3

関数の署名は です。エンコードでエンコードされた文字列を含むバイナリ、またはエンコードでの文字 (コード ポイント) とバイナリの詳細なリストのいずれかunicode:characters_to_list(Data, InEncoding)であると想定されます。Unicode 文字のリストを返します。erlang の文字は整数です。DataInEncodingInEncoding

あなたが呼び出すunicode:characters_to_list(<<208,144,208,145,208,146>>, utf8)unicode:characters_to_list([1040,1041,1042], utf8)、Unicode文字列を正しくデコードすると(はい、整数のリストである限り、2番目はnoopですData)。しかし、unicode:characters_to_list([208,144,208,145,208,146], utf8)erlang を呼び出すと、utf8エンコーディングで 6 文字のリストが渡されたと認識されます。これはすでに Unicode であるため、出力はまったく同じになります。

erlang には型はありませんが、それが受け入れられ、正しく動作するとbyte仮定します。unicode:characters_to_list/2list of bytes

要約すると。erlang で文字列を表現するには、ビット文字列と文字のリストの 2 つの通常の方法があります。エンコーディングでこれらの表現のいずれか (またはそれらの組み合わせ) のunicode:characters_to_list(Data, InEncoding)文字列を取得し、それを Unicode コードポイントのリストに変換します。DataInEncoding

例のようなリストがある場合は[208,144,208,145,208,146]、それをバイナリに変換してからerlang:list_to_binary/1に渡すことができます。unicode:characters_to_list/2

1> unicode:characters_to_list(list_to_binary([208,144,208,145,208,146]), utf8).
[1040,1041,1042]

unicodeモジュールは unicode と latin-1 のみをサポートします。したがって、(関数は unicode または latin-1 のコードポイントを予期するため)characters_to_listコードポイントのフラット リストの場合、リストで何もする必要はありません。ただし、リストが深い場合があります ( unicode:characters_to_list([[1040],1041,<<1042/utf8>>]).)。Dataこれが、引数のリスト データ型をサポートする理由です。

于 2013-10-06T19:17:06.323 に答える
1

<<208,144,208,145,208,146>>UTF-8 バイナリです。

[208,144,208,145,208,146]バイトのリストです (コード ポイントではありません)。

[1040,1041,1042]コードポイントのリストです。

バイトのリストを渡していますが、関数は文字またはバイナリのリストを必要としています。

于 2013-10-06T18:08:53.410 に答える