6

エンコーディングに関してはあまり良くありません。データを元のエンコーディングと同じように返す方法を知りたいのですが...

'»'編集してデータベースに挿入した時点で、いくつかの文字が含まれているファイルがあり、それらはÂ&raquoになっています。

decode_entities()は何もせず、encode_entitiesはcharsを再度エンコードします。だから私はそれを修正するために自分のサブを作成しましたが、ファイルからデータを取得するときに正しい形式で取得されていないようです。

my $file = "c:/perlscripts/" . md5_hex($md5Con) . "-code.php";
{
    local( $/ ); # undefine the record seperator
    open FILE, "<", $file or die "Cannot open:$!\n";
    my $fileContents = unicodeConvert(<FILE>);
    ...
    .. 

次のようなエンコーディングオプションはありませんか。

my $file = "c:/perlscripts/" . md5_hex($md5Con) . "-code.php";
{
    local( $/ ); # undefine the record seperator
    open FILE, "<", $file or die "Cannot open:$!\n", "UTF-8";
    my $fileContents = unicodeConvert(<FILE>);
    ...
    .. 

そして私の潜水艦は;

sub unicodeConvert($) {
   my $str = shift;
    my %entityRef = ("&" => "&amp;", '¢' => "&cent;", '¤' => "&curren;", '¦' => "&brvbar;", '¨' => "&uml;", 'ª' => "&ordf;", '¬' => "&not;", '®' => "&reg;", '°' => "&deg;", '²' => "&sup2;", '´' => "&acute;", '¶' => "&para;", '¸' => "&cedil;", 'º' => "&ordm;", '¼' => "&frac14;", '¾' => "&frac34;", 'À' => "&Agrave;", 'Â' => "&Acirc;", 'Ä' => "&Auml;", 'Æ' => "&AElig;", 'È' => "&Egrave;", 'Ê' => "&Ecirc;", 'Ì' => "&Igrave;", 'Î' => "&Icirc;", 'Ð' => "&ETH;", 'Ò' => "&Ograve;", 'Ô' => "&Ocirc;", 'Ö' => "&Ouml;", 'Ø' => "&Oslash;", 'Ú' => "&Uacute;", 'Ü' => "&Uuml;", 'Þ' => "&THORN;", 'à' => "&agrave;", 'â' => "&acirc;", 'ä' => "&auml;", 'æ' => "&aelig;", 'è' => "&egrave;", 'ê' => "&ecirc;", 'ì' => "&igrave;", 'î' => "&icirc;", 'ð' => "&eth;", 'ò' => "&ograve;", 'ô' => "&ocirc;", 'ö' => "&ouml;", 'ø' => "&oslash;", 'ú' => "&uacute;", 'ü' => "&uuml;", 'þ' => "&thorn;", '¡' => "&iexcl;", '£' => "&pound;", '¥' => "&yen;", '§' => "&sect;", '©' => "&copy;", '«' => "&laquo;", '¯' => "&macr;", '±' => "&plusmn;", '³' => "&sup3;", 'µ' => "&micro;", '·' => "&middot;", '¹' => "&sup1;", '»' => "&raquo;", '½' => "&frac12;", '¿' => "&iquest;", 'Á' => "&Aacute;", 'Ã' => "&Atilde;", 'Å' => "&Aring;", 'Ç' => "&Ccedil;", 'É' => "&Eacute;", 'Ë' => "&Euml;", 'Í' => "&Iacute;", 'Ï' => "&Iuml;", 'Ñ' => "&Ntilde;", 'Ó' => "&Oacute;", 'Õ' => "&Otilde;", '×' => "&times;", 'Ù' => "&Ugrave;", 'Û' => "&Ucirc;", 'Ý' => "&Yacute;", 'ß' => "&szlig;", 'á' => "&aacute;", 'ã' => "&atilde;", 'å' => "&aring;", 'ç' => "&ccedil;", 'é' => "&eacute;", 'ë' => "&euml;", 'í' => "&iacute;", 'ï' => "&iuml;", 'ñ' => "&ntilde;", 'ó' => "&oacute;", 'õ' => "&otilde;", '÷' => "&divide;", 'ù' => "&ugrave;", 'û' => "&ucirc;", 'ý' => "&yacute;", 'ÿ' => "&yuml;");
    while( ( my $key, my $obj ) = each( %entityRef ) ) {
        if( $key ne '&' ) {
                $str =~ s/$key/$obj/gis
        } else {
                $str =~ s#&((?!(quot;)|(amp;)|(cent;)|(curren;)|(brvbar;)|(uml;)|(ordf;)|(not;)|(reg;)|(deg;)|(sup2;)|(acute;)|(para;)|(cedil;)|(ordm;)|(frac14;)|(frac34;)|(Agrave;)|(Acirc;)|(Auml;)|(AElig;)|(Egrave;)|(Ecirc;)|(Igrave;)|(Icirc;)|(ETH;)|(Ograve;)|(Ocirc;)|(Ouml;)|(Oslash;)|(Uacute;)|(Uuml;)|(THORN;)|(agrave;)|(acirc;)|(auml;)|(aelig;)|(egrave;)|(ecirc;)|(igrave;)|(icirc;)|(eth;)|(ograve;)|(ocirc;)|(ouml;)|(oslash;)|(uacute;)|(uuml;)|(thorn;)|(iexcl;)|(pound;)|(yen;)|(sect;)|(copy;)|(laquo;)|(macr;)|(plusmn;)|(sup3;)|(micro;)|(middot;)|(sup1;)|(raquo;)|(frac12;)|(iquest;)|(Aacute;)|(Atilde;)|(Aring;)|(Ccedil;)|(Eacute;)|(Euml;)|(Iacute;)|(Iuml;)|(Ntilde;)|(Oacute;)|(Otilde;)|(times;)|(Ugrave;)|(Ucirc;)|(Yacute;)|(szlig;)|(aacute;)|(atilde;)|(aring;)|(ccedil;)|(eacute;)|(euml;)|(iacute;)|(iuml;)|(ntilde;)|(oacute;)|(otilde;)|(divide;)|(ugrave;)|(ucirc;)|(yacute;)|(yuml;)|(nbsp;)))#$obj#gis;   
        }
    }
    return $str;
}
4

2 に答える 2

8

あなたの質問へのコメントに記載されているように、私はあなたが正確に何を求めているのかわかりません。

したがって、Unicode文字をHTMLエンティティに変換しようとしていると想定しています。その場合、事前に作成されたモジュールの1つを使用する方が適切です。エンコーディングの問題(Perlではかなりトリッキーです)が原因でそれが機能しない場合は、あなたの質問に対する答えは次のとおりです。

のようなエンコーディングオプションはありませんか

open FILE, "<", $file or die "Cannot open:$!\n", "UTF-8";

...おそらくそれを解決し、おそらくあなた自身の試みもうまくいくでしょうが、既製のものを使用する方が良いです;-)(ちなみに、あなたがそれを書いた方法は「UTF-8」でした"dieあなたが何を求めているのか理解するのを少し難しくしたオプション;-)

はい、最近perl(> = v5.8)あると仮定すると、UTF-8オプションがあります。

open(my $fh,'<:encoding(UTF-8)', $file) or die "Error opening $file: $!";

perluniintroから採用された例)

binmodeすでに開いているファイルハンドル(STDIN / OUTなど)を変更するために使用することもできます。

binmode(STDOUT, ":encoding(UTF-8)");

openプラグマを使用してデフォルトのエンコーディングを設定することもできます。

しかし、これについては、オープンラインを試すbinmodeか変更して、それで解決するかどうかを確認することをお勧めします。

perlv5.8未満の場合は注意が必要ですが、バージョンを教えていただければ解決できる可能性があります。

ちなみに私が気付いた他のいくつかのこと:

  • 必須ではありませんが、(my $fhの代わりにFILE)字句スコープのファイルハンドルを使用することをお勧めします。
  • 文字列に改行を入れるとdie、問題を見つけるのに役立つ通常追加される行番号情報が抑制されます。
  • 開くことができなかったファイルの名前(または失敗したSQLなど)をdieメッセージに入れると、デバッグが容易になります。
  • Perlではサブプロトタイプを使用しないでください(5) :( sub unicodeConvert($))。$//などを@入れないでください%。それは物事をチェックするだけでなく、混乱する方法で意味を変えるかもしれません。新しい「組み込みスタイル」の演算子を作成するだけで済みます。
于 2010-02-08T16:04:38.320 に答える
1

端末の文字セット(UTF-8の場合もあります)とperlスクリプトのソースコード(8859-1の文字セット対応エディターで編集する可能性があります)に違いがあるのではないかと思います。端末とソースコードが同じ文字セットに含まれていることが確実な場合は、use utf8;スクリプトヘッダーに配置してみてください(man perlunicodeを参照)。それでも問題が解決しない場合は、データベースに保存されているデータを印刷してみてください(DBIのデバッグログを増やしてください)(UTF8としてデータを保存しないため、おそらく無関係です)。一般的に、以下を提供するようにしてください。

  1. 端末のスクリプトを実行する場合の端末のコードページ(locale)(または、apacheなどから起動する場合はサーバーで使用されるシステムロケール)
  2. ソースコードの文字セット。
  3. MySQL接続コードページ(発行しSET NAMES 'utf8'ますか?)

また、HTMLエンコーディングの場合、これを自分で実装するよりもHTML::Entities::decode()、再利用する方が簡単な場合があります。HTML::Entities::encode()

于 2010-02-08T11:15:15.690 に答える