2012-06-20 26 views
8

:私はページをフェッチしてるのPerl&MongoDBのバイナリデータ<a href="https://metacpan.org/module/MongoDB%3a%3aDataTypes">MongoDB</a>マニュアルから

By default, all database strings are UTF8. To save images, binaries, and other non-UTF8 data, you can pass the string as a reference to the database.

は、後の処理のためにコンテンツを格納します。

  • 多くのページがUTF8のコンテンツを持っていますが、誤って宣言するISO-8859-1または類似
  • のでEncode(元の文字セットを知らない)
  • を使用することはできませんので、私は、メタ文字セットに依存することはできません

    sub save { 
        my ($self, $ok, $url, $fetchtime, $request) = @_; 
    
        my $rawhead = $request->headers_as_string; 
        my $rawbody = $request->content; 
    
        $self->db->content->insert(
         { "url" => $url, "rhead" => \$rawhead, "rbody" => \$rawbody }) #using references here 
         if $ok; 
    
        $self->db->links->update(
         { "url" => $url }, 
         { 
          '$set' => { 
           'status'  => $request->code, 
           'valid'  => $ok, 
           'last_checked' => time(), 
           'fetchtime' => $fetchtime, 
          } 
         } 
        ); 
    } 
    
  • そのため、私は後で処理する私のコードの

フラグメントのコンテンツ単にas flow of bytes(バイナリデータ)を保存したいです10

しかし、エラーが表示されます。

Wide character in subroutine entry at /opt/local/lib/perl5/site_perl/5.14.2/darwin-multi-2level/MongoDB/Collection.pm line 296.

は、これは私がデータを格納する唯一の場所です。

質問:MondoDBにバイナリデータを格納する唯一の方法は、それらをエンコードすることです。ベース64?

+0

マニュアルで与えられたサンプル( '' \ xFF \ xFE \ xFF '')に' $ rawhead'と '' $ rawbody'をセットした場合、同じ警告が表示されますか? – raina77ow

答えて

4

それは別の悲しい物語私が間違っている可能性があり

について _utf8_フラグ...のように見えますが、HTTPの::メッセージ headers_as_stringcontent方法は、文字のシーケンスとしてその文字列を返すようです。しかし、MongoDBドライバは明示的に渡された文字列がバイナリとして一連のオクテットであることを期待しています。したがって警告ドラマです。

むしろ醜い修正は

...このようなもので、(私はそれが本当にMongoDBのドライバ自体によって行われるべきではないだろうか?)あなたのコード内の$ rawheadと$ rawbodyに utf8旗を降ろすことです
_utf8_off $rawhead; 
_utf8_off $rawbody; # ugh 

代わりにencode('utf8', $rawhead)を使用していますが、DBから値を抽出するときはdecodeを使用する必要があります。疑いはないと思います。

0

データは文字であり、八重奏ではありません。あなたが前提としているのは、あなたが八重奏として処理しているだけのことですが、おそらく気づかなくても、入力データをデコードすることによって、その前提に違反しているに違いありません。

単純にデコードしないでください。データはオクテットを保持し、dbに格納することは失敗しません。

関連する問題