我在编码方面不太好,我想弄清楚如何以与开始时相同的编码返回数据......

我有一个文件,其中包含一些字符,例如 '»' 当我编辑并插入数据库时​​,它们已经变成了“。”

decode_entities() 什么都不做,encode_entities 再次对字符进行编码。因此,我创建了自己的子程序来解决这个问题,但似乎从文件中获取数据时,它没有以正确的格式检索。

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: $!";

(示例改编自 佩鲁尼简介)

您还可以使用 binmode 更改已打开的文件句柄(例如标准输入/输出)。

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

您还可以使用以下命令设置默认编码 打开 杂注。

但为此我建议尝试 binmode 或者改变你的开放线路看看是否能解决问题。

如果你有一个 perl 低于 v5.8,事情会比较棘手,但如果您告诉我们版本,也许可以解决。

顺便说一句,我还注意到其他几件事:

  • 不是必需的,但最好使用词法范围的文件句柄(my $fh 代替 FILE).
  • 当你在上面添加换行符时 die string,它会抑制通常添加的行号信息以帮助您查找问题。
  • 如果将无法打开的文件的名称(或失败的 SQL 或其他内容)放入 die 消息中,调试起来会更容易。
  • 不要在 Perl 中使用子原型 (5) : (sub unicodeConvert($))。不要把 $/@/% ETC。在那里。它不只是检查事物,还可能以令人困惑的方式改变含义。只需要创建新的“内置样式”运算符。

其他提示

我怀疑,您的终端字符集(可以是 UTF-8)和 Perl 脚本的源代码(您可以在 8859-1 中的某些支持字符集的编辑器中进行编辑)存在差异。如果您确定您的终端和源代码采用相同的字符集,请尝试将 use utf8; 到你的脚本头(参见 人 perluunicode)。如果这没有帮助,请尝试打印存储到数据库中的数据(增加 DBI 的调试日志记录)(可能不相关,因为您不将数据存储为 UTF8)。一般来说,尝试提供:

  1. 您的终端的代码页(locale)如果您为终端(或服务器使用的系统区域设置)执行脚本,如果您从例如阿帕奇)
  2. 您的源代码的字符集。
  3. MySQL 连接代码页(您是否发出 SET NAMES 'utf8'?)

另外,对于 HTML 编码,您可能会发现更容易重用 HTML::Entities::decode() / HTML::Entities::encode() 而不是你自己实现这个。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top