Perl-エンコードメソッドを備えたファイルを読む?
質問
エンコードに関してはあまり良くありません。同じエンコードが始まったのと同じエンコードとしてデータを返す方法を見つけたいと思っています...
のような文字を含むファイルがあります '»'
編集してデータベースに挿入するまでに、それらはâ»に変わりました。
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 = ("&" => "&", '¢' => "¢", '¤' => "¤", '¦' => "¦", '¨' => "¨", 'ª' => "ª", '¬' => "¬", '®' => "®", '°' => "°", '²' => "²", '´' => "´", '¶' => "¶", '¸' => "¸", 'º' => "º", '¼' => "¼", '¾' => "¾", 'À' => "À", 'Â' => "Â", 'Ä' => "Ä", 'Æ' => "Æ", 'È' => "È", 'Ê' => "Ê", 'Ì' => "Ì", 'Î' => "Î", 'Ð' => "Ð", 'Ò' => "Ò", 'Ô' => "Ô", 'Ö' => "Ö", 'Ø' => "Ø", 'Ú' => "Ú", 'Ü' => "Ü", 'Þ' => "Þ", 'à' => "à", 'â' => "â", 'ä' => "ä", 'æ' => "æ", 'è' => "è", 'ê' => "ê", 'ì' => "ì", 'î' => "î", 'ð' => "ð", 'ò' => "ò", 'ô' => "ô", 'ö' => "ö", 'ø' => "ø", 'ú' => "ú", 'ü' => "ü", 'þ' => "þ", '¡' => "¡", '£' => "£", '¥' => "¥", '§' => "§", '©' => "©", '«' => "«", '¯' => "¯", '±' => "±", '³' => "³", 'µ' => "µ", '·' => "·", '¹' => "¹", '»' => "»", '½' => "½", '¿' => "¿", 'Á' => "Á", 'Ã' => "Ã", 'Å' => "Å", 'Ç' => "Ç", 'É' => "É", 'Ë' => "Ë", 'Í' => "Í", 'Ï' => "Ï", 'Ñ' => "Ñ", 'Ó' => "Ó", 'Õ' => "Õ", '×' => "×", 'Ù' => "Ù", 'Û' => "Û", 'Ý' => "Ý", 'ß' => "ß", 'á' => "á", 'ã' => "ã", 'å' => "å", 'ç' => "ç", 'é' => "é", 'ë' => "ë", 'í' => "í", 'ï' => "ï", 'ñ' => "ñ", 'ó' => "ó", 'õ' => "õ", '÷' => "÷", 'ù' => "ù", 'û' => "û", 'ý' => "ý", 'ÿ' => "ÿ");
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;
}
解決
あなたの質問についてのコメントに記載されているように、私はあなたが正確に何を求めているのか確信が持てません。
したがって、Unicode文字をHTMLエンティティに変換しようとしていると思います。その場合、事前に作成されたモジュールの1つを使用する方が良いはずです。エンコードの問題(Perlで非常に注意が必要です)のためにそれが機能していない場合、あなたの質問に対する答えは次のとおりです。
エンコードオプションはありませんか
open FILE, "<", $file or die "Cannot open:$!\n", "UTF-8";
...おそらくそれを解決するでしょう、そしてそれはおそらくあなた自身の試みを機能させるでしょうが、既製のものを使用する方が良いです;-)(ところで、あなたがそれを書いた方法は「UTF-8としてありました「オプション die
それはあなたが何を求めていたかを理解するのが少し難しくなりました;-)
はい、あなたが最近持っていると仮定して、UTF-8オプションがあります perl
(> = v5.8):
open(my $fh,'<:encoding(UTF-8)', $file) or die "Error opening $file: $!";
(例から適応した例 Perluniintro)
使用することもできます binmode
すでに開いているファイルハンドルを変更するには(stdin/outなど)。
binmode(STDOUT, ":encoding(UTF-8)");
デフォルトのエンコードを次のように設定することもできます 開いた プラグマ。
しかし、このために試してみることをお勧めします binmode
または、オープンラインを変更して、それが解決するかどうかを確認します。
あなたが持っている場合 perl
v5.8未満では、物事は難しいですが、バージョンを教えてくれると解決できるかもしれません。
ちなみに私が気づいた他のいくつかのこと:
- 必須ではありませんが、字句的にスコープされたファイルハンドルを使用する方が良いと考えられています(
my $fh
それ以外のFILE
). - に新しいラインを置くとき
die
文字列、問題を見つけるのに役立つように通常追加される行番号情報を抑制します。 - Dieメッセージで開くことができなかったファイル(または故障したSQLなど)を配置すると、デバッグが簡単になります。
- Perlでサブプロトタイプを使用しないでください(5) : (
sub unicodeConvert($)
)。置かないでください$
/@
/%
など。それは単に物事をチェックするだけでなく、混乱する方法で意味を変えるかもしれません。新しい「組み込みスタイル」オペレーターを作成するだけで必要です。
他のヒント
端末の充電(UTF-8になる可能性がある)とPerlスクリプトのソースコード(8859-1のCharset-Awareエディターで編集する可能性が高い)の違いがあると思います。確かな場合は、端末とソースコードが同じチャーセットにあることを確認してください。 use utf8;
スクリプトヘッダーに(参照してください マンパールニコード)。それが役に立たない場合は、データベースに保存されているデータを印刷してみてください(DBIのデバッグロギングを増やす)(UTF8のようにデータを保存しないため、おそらく無関係です)。一般的に、提供してみてください:
- ターミナルのコードページ(
locale
)ターミナル(またはサーバーが使用するシステムロケール、EG Apacheから起動する場合)のスクリプトを実行する場合) - ソースコードのcharset。
- MySQL接続コードページ(発行しますか
SET NAMES 'utf8'
?)
また、HTMLエンコードの場合、再利用しやすいと感じるかもしれません HTML::Entities::decode()
/ HTML::Entities::encode()
これを自分で実装するのではなく。