2

iPhoneクライアントアプリからのテキスト(絵文字付き)をErlangを使用してMySQLデータベースに保存しようとしています。(varchar列に)

私はC++とmysqlppで行われたソケット接続サーバーでそれを行っていました、それはうまく機能していました。(これはまったく同じデータベースであるため、問題はデータベースから発生したものではないと推測できます

ただし、スケーラビリティの理由からすべてをErlangに渡すことにしました。そのため、絵文字を正しく保存および取得できません。

データベースとの通信にemysqlを使用しています。

保存するときは、このリストをデータベースに送信します。

[240,159,152,130]

私が検索しているとき、ここで私が得るもの:

<<195,176,194,159,194,152,194,130>>

明らかにいくつかの類似点があります。両方の行に159、152、および130が表示されますが、240は表示されません。195、176、および194がどこから来たのかわかりません。

接続プールを作成するときにemysqlエンコーディングを変更することについては考えました。

 emysql:add_pool(my_db, 3, "login", "password", "db.mydomain.com", 3306, "MyTable", utf8)

しかし、utf32エンコーディングに適したアトムを見つけることができるようです。(興味深いのは、C ++とmysqlppにエンコーディングを設定していないことです。これは、そのまま使用できます)。

私はいくつかのテストを行いました...

storing from C++, retrieving from C++ (Works fine)
storing from Erlang, retrieving from Erlang (Does not work)
storing from Erlang, retrieving from C++ (Does not work)
storing from C++, retrieving from Erlang (Does not work)

もう1つ、C ++を使用していないのに、Erlangでプリペアドステートメントを使用しています。

どんな助けでもいただければ幸いです。

要求に応じて、ここでデータを保存するためのクエリ:

UPDATE Table SET c=? WHERE id=?

とてもシンプルです...

4

1 に答える 1

1

それはすべてutf-8エンコーディングに関するものです。アーランでは、文字のリストは、あなたの場合[240,159,152,130]、通常はエンコードされていませんが、ユニコードコードポイントです。データを取得すると、文字のutf-8エンコードバイトを含むバイナリが取得されました。このエンコーディングがどこで発生したのか正確にはわかりません。erlangシェルから:

10> Bin = <<195,176,194,159,194,152,194,130>>.   
<<195,176,194,159,194,152,194,130>>
11> <<M/utf8,N/utf8,O/utf8,P/utf8,R/binary>> = Bin.
<<195,176,194,159,194,152,194,130>>
12> [M,N,O,P].
[240,159,152,130]

erlangでのユニコードの処理は非常に簡単です。リスト内の文字は通常ユニコードコードポイントであり、エンコードされることはめったにありませんが、バイナリに格納すると、バイナリはバイトの配列にすぎないため、何らかの方法でエンコードする必要があります。デフォルトのエンコーディングはutf-8です。モジュールunicodeには、Unicodeリストとバイナリの間で変換するための関数があります。

于 2012-03-12T23:10:01.597 に答える