سؤال

أنا لست جيدا عندما يتعلق الأمر بالترميز وأريد معرفة كيفية إرجاع البيانات كما ترميز نفسه بدأت مع ...

لدي ملف مع بعض الأحرف في مثل '»' بحلول الوقت الذي قمت بتحريره وإدراجه في قاعدة البيانات التي تحولت إلى Â ».

decode_entities () لا يوجد شيء وتشفير chars chars مرة أخرى. لذلك قمت بإنشاء SUB الخاص بي لإصلاح ذلك، لكنه يرصد أنه عند الحصول على البيانات من الملف، لا يتم استرجاعه بالتنسيق الصحيح.

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;
}
هل كانت مفيدة؟

المحلول

كما لوحظ في التعليق على سؤالك، أنا غير متأكد من أنك تسأل بالضبط.

لذلك أنا أفترض أنك تحاول تحويل أحرف Unicode إلى كيانات HTML. في هذه الحالة، يجب أن يكون استخدام أحد الوحدات النمطية مسبقا أفضل. إذا لم يكن ذلك يعمل بسبب المشكلات الترميز (التي هي صعبة للغاية في بيرل)، فإن الإجابة على سؤالك:

لا يوجد خيار ترميز مثل

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 لتغيير ملف Filehandle مفتوح بالفعل (مثل Stdin / خارج).

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

يمكنك أيضا تعيين الترميز الافتراضي مع افتح براغما.

ولكن لهذا أقترح محاولة binmode أو تغيير الخط المفتوح لمعرفة ما إذا كان هذا يحلها.

اذا كان لديك perl أقل من v5.8، الأشياء هي متعثفة، ولكن ربما المحاسبة إذا قلت لنا الإصدار.

بضعة أشياء أخرى لاحظت بها بالمناسبة:

  • ليست ضرورية، لكنها تعتبر أفضل لاستخدام ملف filehandle مبكرة (my $fh بدلاً من FILE).
  • عند وضع جديد على die سلسلة، يقوم بتقويم معلومات رقم السطر الذي يضاف عادة لمساعدتك في العثور على المشكلة.
  • إذا وضعت اسم الملف الذي لا يمكن فتحه (أو SQL الذي فشل، أو أيا كان) في رسالة DIT، فسيكون من الأسهل تصحيح الأخطاء.
  • لا تستخدم النماذج الأولية الفرعية في بيرل (5) : (sub unicodeConvert($)). لا تضع $/@/% وما إلى ذلك هناك. لا تحقق فقط من الأشياء، فقد يغير المعنى بطرق مربكة. هناك حاجة فقط لإنشاء مشغلي "نمط مدمج" جديد.

نصائح أخرى

أظن أن هناك اختلافا في charsets of terminal الخاص بك (والتي يمكن أن تكون UTF-8) ومزددة المصدر لبرنامج Perl Script الخاص بك (والتي ربما تحريرها في بعض محرر CHARSET-AWARE في 8859-1). إذا كنت متأكدا من أن محطةك ومكفيتك في نفسها موجودة في نفسها، فحاول وضعها use utf8; إلى رأس البرنامج النصي الخاص بك (انظر رجل perlunicode.). إذا لم يساعد ذلك، فحاول طباعة البيانات، والذي يتم تخزينه في قاعدة البيانات الخاصة بك (زيادة تسجيل التصحيح ل DBI) (ربما غير ذي إجادة، لأنك لا تخزن البيانات كما UTF8). بشكل عام، حاول تقديم:

  1. شفرة محطة الخاص بك (locale) إذا قمت بتنفيذ البرنامج النصي الخاص بك للحصول على محطة (أو لغة النظام، والذي يستخدمه الخادم الخاص بك، إذا قمت بتشغيله من EG Apache)
  2. تجفيف شفرة المصدر الخاصة بك.
  3. خط اتصال MySQL (هل تصدر SET NAMES 'utf8'?)

أيضا لترميز HTML قد تجد أسهل لإعادة الاستخدام HTML::Entities::decode() / HTML::Entities::encode() بدلا من تنفيذ هذا لوحدك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top