Вопрос

Я не слишком хорош, когда дело доходит до кодирования, и я хочу выяснить, как вернуть данные в качестве той же кодирования, что началось с ...

У меня есть файл с некоторыми символами в таких как '»' К тому времени, когда я отредактировал и вставил в базу данных, они превратились в ».

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;
}
Это было полезно?

Решение

Как отмечалось в комментарии по вашему вопросу, я не уверен, что именно вы спрашиваете.

Так что я предполагаю, что вы пытаетесь преобразовать символы Unicode в HTML -сущности. В этом случае использование одного из готовых модулей должно быть лучше. Если это не работает из -за проблем кодирования (которые довольно сложно в 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, все сложнее, но, возможно, разрешается, если вы сообщите нам версию.

Кстати, пара других вещей:

  • Не обязательно, но считается, что лучше использовать лексическую атмосферу FileHandle (my $fh вместо FILE).
  • Когда вы поставите новую линию на die Строка, он подавляет информацию о номере строки, которая обычно добавляется, чтобы помочь вам найти проблему.
  • Если вы поместите имя файла, который не может быть открыт (или SQL, который не удался, или что -то еще) в сообщение Die будет проще отладить.
  • Не используйте субтотипы в Perl (5) : (sub unicodeConvert($)) Не ставит $/@/% и т.д. там. Это не просто проверяет вещи, это может изменить смысл в запутанных способах. Это необходимо только для создания новых операторов «встроенного стиля».

Другие советы

Я подозреваю, что вы разница в Charsets вашего терминала (который может быть UTF-8) и исходный код вашего сценария PERL (который вы, возможно, редактируете в каком-то редакторе AHRETE-AWARE в 8859-1). Если вы уверены, что ваш терминал и ваш исходный код находятся в одном и том же Charset, попробуйте поместить use utf8; к заголовку сценария (см. Человек Перлуникод) Если это не помогает, попробуйте распечатать данные, которые хранятся в вашей базе данных (увеличение журнала отладки для DBI) (возможно, неправдообразно, поскольку вы не храните данные как UTF8). Как правило, старайтесь предоставить:

  1. Кодекс вашего терминала (locale) Если вы выполняете свой скрипт для терминала (или локали системы, который используется вашим сервером, если вы запустите его из EG Apache)
  2. Charset вашего исходного кода.
  3. MySQL Connection Codepage (вы выпускаете SET NAMES 'utf8'?)

Также для кодирования HTML вы можете найти легче в повторном использовании HTML::Entities::decode() / HTML::Entities::encode() вместо того, чтобы реализовать это самостоятельно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top