2

私のmysqlデータベースは、dbiを使用してデータベースからテキストフィールドを読み取り、それを$ variableに格納し、この変数でlenght関数を実行すると、ut8_generic_ciにエンコードされます。数値の長さを取得します。

  my $data retrive_text_from_db(); #using dbi
  print length $data; 

しかし、$ dataをテキストファイルに保存してから、別のスクリプトでそれを読み取って長さ関数を実行しようとすると、長さが異なる場合があります

     open T, '<'  ,'file.txt' or die $!;
     binmode(T, ":utf8");
     my $text;
     {local $/; $text=<T>; }
     print length $text; 

誰かがこの問題を経験しましたか/誰かが問題の原因となる可能性があるものとそれを解決する方法を教えてもらえますか?

4

2 に答える 2

3

Perl 文字列は、バイト指向または文字指向のいずれかです。最初の例で報告された長さは、常に 2 番目の例で報告された長さ以上であると思いますか?

を使用するbinmode(T, ":utf8")場合、Perl にファイル内のバイト ストリームを取得し、それらを UTF-8 エンコーディングを使用して自動的に文字に変換するように指示します。したがって、この例$textでは文字列にする必要があります。

私の推測では、この変換を実行するように DBI を構成していないため、UTF-8 でエンコードされたデータを含むバイト文字列になってしまうと思います。つまり、一部の文字にはそれぞれ 2 ~ 4 バイトが必要な場合があります。1 つのオプションは、UTF-8 を正しく処理するように DBI を構成することです。これを行う方法はドライバーによって異なります。MySQL を使用しているため、次の方法で接続することで機能するはずです。

my $dbh = DBI->connect($dsn, $user, $passwrod, { mysql_enable_utf8 => 1 });

何らかの理由で、この構成変数のデフォルトがオフになっているようです。

別の方法として、Encode モジュールを使用して自分で変換することもできます。

use Encode;
$data = decode_utf8($data);
于 2012-09-26T12:56:16.570 に答える
0

ここで最初に試すことは、 と の両方$data$text画面に出力して、それらが同じかどうかを確認することです。文字エンコーディングに問題がある場合、そのうちの 1 つが失敗する可能性があります。その場合は、pmakholm が提案したように、 encodeモジュールを調べてください。

そのテストが成功した場合、それはもっと微妙なものです。

そのような可能性の 1 つは、入力データとテキスト ファイルの間で改行が異なる方法で格納されていることです。一部の形式では、改行は 1 文字です。他の場合は、2 つの文字です。これにより、データが事実上同じであっても、異なる長さが得られます。

于 2012-09-26T13:02:20.197 に答える