phpでTwitter APIからつぶやきを取得してDBに登録しているのですが、その際に、

invalid byte sequence for encoding "UNICODE": 0xeda0bd
のようなエラーが頻発してしまいます。

Twitterで該当のつぶやきを検索してみると、
・顔文字
・ハートなどの特殊な絵文字
が含まれており、その部分でエラーになっているようです。

エラーの意味合いとしては、登録しようとした文字がUNICODEには無いということだと思うのですが、DBに登録する前にmb_convert_encodingで文字コードを変換してから登録しているのに何故エラーになってしまうのかが分かりません。。
ちなみにOAuthの認証用ライブラリは「twitteroauth」を使用しています。

どうしたらエラーにならずに登録出来るのか、ご存知でしたら教えてください。
よろしくお願いいたします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/12/23 18:00:08
id:sheepsace

ちなみに、使用DBはPostgreSQL7.4.16です。

DBの文字コードはUNICODE、phpプログラムの文字コードはUTF-8です。

エラーになるバイト文字は「0xeda0bd」「0xeda0bc」がほとんどのようです。

これらの文字は何なのでしょうか?

回答0件)

回答はまだありません

  • id:fiwa
    0xeda0bd, 0xeda0bc はいずれも上位サロゲートですよね。
    参考になるかどうかわかりませんが。
    https://dev.twitter.com/discussions/10264
  • id:TransFreeBSD
    http://ja.wikipedia.org/wiki/UTF-8#.E3.82.B5.E3.83.AD.E3.82.B2.E3.83.BC.E3.83.88.E3.83.9A.E3.82.A2.E3.81.AE.E6.89.B1.E3.81.84
    http://hirakun.blog57.fc2.com/blog-entry-215.html
    サロゲートペアの処理が上手く行ってない感じ?
    php内部はutf-8っぽいのでjson周りの問題なのかな?
    php自体なのかライブラリとかのバージョンの問題なのか。
    Normalizer::normalizeとか通すと修正されたりしないだろうか。
    よくわからないのでコメントで。
  • id:sheepsace
    おふたりともコメントありがとうございます!
    頭の中は「さろげーと?」という感じですが…後程勉強したいとおもいます。

    >fiwaさん
    参考リンクありがとうございます。
    海の向こうにも同じ問題に悩む方がいらっしゃったのですね。
    何か同じ問題を抱えた人が集まって、結局まだ解決してないみたいですね…

    >TransFreeBSDさん
    当方のphpのバージョンが5.2.1(古い…)なので、Normalizerは使えないみたいですね。
    頂いた情報を元に、「php」「json」「サロゲートペア」などで検索かけてみたところ、確かにjson周りがあやしい気がします。
    =======================
    ■json_decode はサロゲートペアの範囲の不正な文字を正しく処理できない
    http://blog.sarabande.jp/post/53105703766
    ■json_encode、json_decode の不正なバイト列処理改善の改訂版
    http://blog.sarabande.jp/post/53799156387
    ■PHPでサロゲートペアをJSONで扱うときのバグ。
    http://pdfbjj.blogspot.jp/2013/04/phpjson.html
    =======================
    APIの実行結果を取得するときにjson_decodeを使っているんですよね…

    php5.2.1で、json_decodeを使わないで上手いこと処理する方法は無いものでしょうか…
  • id:sheepsace
    ちなみにこういう文字が入ってるつぶやきがエラーになります。

    ♥️✨
  • id:sheepsace
    と書こうとしたのですが、豆腐になりますね。
    絵文字は豆腐になってもいいので、エラーにならずにDBに登録したいのですが、いい手はないでしょうか。
    しかし若いおじょうさん方はどうやって「キラキラ」だの「桜のマーク」だのを入力しているのでしょうか…

    というところまでを1個前のコメントで書いたのですが、豆腐までしか表示されてないですね…
  • id:sheepsace
    あれっ、Chromeで見ると豆腐だけど、Firefoxで見ると絵文字になってる…
  • id:fiwa
    これらの文字はサロゲートペアを使う絵文字ではないですね。
    ♥️
    http://www.charbase.com/2764-unicode-heavy-black-heart

    http://www.charbase.com/2728-unicode-sparkles

    絵文字がブラウザによって表示が違うという話なら、例えばこういったものがあります。
    https://groups.google.com/forum/#!topic/pcfanml/UZckxKVxMd8

    ちなみに私の環境からは上のコメントはこんな風に見えてます。
    http://f.hatena.ne.jp/fiwa/20131220193100
  • id:sheepsace
    サロゲートペアの文字を弾いてから、json_encodeする方法はないですか?
    表示は正直どうでもいいです。
    エラーにならないでDBに登録するのが最終目的です。
  • id:fiwa
    ググってみたらこんなページがありました。
    http://magp.ie/2011/01/06/remove-non-utf8-characters-from-string-with-php/

    バイト列をもとに問題になりそうなnon-UTF8な文字を抽出して、?に置き換えているようです。
    例によって参考になるかどうかは定かではありせんが、とりあえずお知らせまで。
  • id:fiwa
    上のページはStackOverflowでも紹介されていました。
    http://stackoverflow.com/questions/7502164/replacing-non-utf8-characters
  • id:sheepsace
    >fiwaさん
    参考ページのご紹介ありがとうございました!
    iPhoneから絵文字を使ってツイートした時にDB登録エラーが再現出来たのですが、
    教えて頂いたページの方法を使ったら、エラーにならないで「?」で登録できました!
    本当にありがとうございました!

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません