19

私のおいしいto wp perlスクリプトは機能しますが、すべての「奇妙な」文字に対してさらに奇妙な出力が得られます。だから私は試しました

$description = decode_utf8( $description ); 

しかし、それは違いはありません。たとえば、「go live」を「go live」ではなく「go live」にしたいのですが、これが機能するように Perl で Unicode を処理するにはどうすればよいですか?

更新: 問題は、Perl で設定しなければならなかった DBI の utf を設定することであることがわかりました:

my $sql = qq{SET NAMES 'utf8';};
$dbh->do($sql);

それは私が設定しなければならなかった部分でした。ありがとう!

4

6 に答える 6

14

次のようにデータベースに接続するときは、UTF8 を有効にします。

my $dbh = DBI->connect(
    "dbi:mysql:dbname=db_name", 
    "db_user", "db_pass",
     {RaiseError => 0, PrintError => 0, mysql_enable_utf8 => 1}
 ) or die "Connect to database failed.";

これにより、必要に応じて UTF8 フラグが設定された文字モード文字列が取得されます。

DBI General Interface Rules & Caveatsから:

Perl は 2 種類の文字列をサポートしています: Unicode (内部的に utf8) と非 Unicode (エンコーディングを強制された場合のデフォルトは iso-8859-1) です。ドライバーは、両方の種類の文字列を受け入れ、必要に応じて、使用されているデータベースの文字セットに変換する必要があります。同様に、データベースから iso-8859-1 以外の文字データを取得する場合、ドライバーはそれを utf8 に変換する必要があります。

そして、mysql_enable_utf8 のDBD::mysqlからの詳細

さらに、このフラグをオンにすると、受信データを UTF-8 として扱う必要があることが MySQL に通知されます。これは、connect() の呼び出しの一部として使用された場合にのみ有効になります。接続後にフラグをオンにした場合、同じ効果を得るにはコマンド SET NAMES utf8 を発行する必要があります。

于 2012-06-20T06:23:46.560 に答える
5

用語

$dbh->do(qq{SET NAMES 'utf8';});

utf-8 で宣言されたデータベースにアクセスする時間を確実に節約しますが、db から取得したデータを perl で処理する場合は、perl var に utf8 文字列として保存することをお勧めします。この操作は暗黙的ではないためです。

$utfstring = decode('utf8',$string_from_db);

もちろん、utf8 文字列の適切な I/O 処理 (読み取り、出力、出力への書き込み) のために忘れずに設定してください

use open ':utf8';

binmode STDOUT, ":utf8";

後者は、utf8 文字列を出力するために不可欠です。お役に立てれば。

于 2011-01-06T12:30:57.980 に答える
3

Perl とは関係ないかもしれません。関連する MySQL テーブル列で UTF エンコーディングを使用していることを確認してください。

于 2009-06-11T21:26:04.207 に答える
1

これを省略します:

binmode STDOUT, ":utf8";

使用時:

$dbh->do(qq{SET NAMES 'utf8';});

そうしないと、出力に二重の utf8 エンコーディングが含まれ、2 バイト文字が読み取れなくなります。これを理解するのに数時間かかりました..

于 2011-05-12T17:05:36.747 に答える