Perl-使用编码方法读取文件?
我不太好,当谈到编码,我想找出如何返回数据,因为它开始与相同的编码 我有一个文件,其中包含一些字符,例如,Perl-使用编码方法读取文件?,perl,file,encode,entities,Perl,File,Encode,Entities,我不太好,当谈到编码,我想找出如何返回数据,因为它开始与相同的编码 我有一个文件,其中包含一些字符,例如,“»”,当我编辑并插入到数据库中时,这些字符已经变成了» decode_entities()不执行任何操作,而encode_entities再次对字符进行编码。因此,我创建了自己的sub来解决这个问题,但它指出,当从文件中获取数据时,它检索的格式不正确 my $file = "c:/perlscripts/" . md5_hex($md5Con) . "-code.php"; {
“»”
,当我编辑并插入到数据库中时,这些字符已经变成了»
decode_entities()不执行任何操作,而encode_entities再次对字符进行编码。因此,我创建了自己的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>);
...
..
我怀疑,您的终端的字符集(可以是UTF-8)和perl脚本的源代码(可以在8859-1中的一些字符集感知编辑器中编辑)之间存在差异。如果您确信终端和源代码在同一个字符集中,请尝试使用utf8代码>到脚本头(请参阅)。如果这不起作用,请尝试打印存储到数据库中的数据(增加DBI的调试日志记录)(可能是iRRerevent,因为您不将数据存储为UTF8)。一般来说,尽量提供:
locale
)设置名称“utf8”
?)此外,对于HTML编码,您可能会发现重用
HTML::Entities::decode()
/HTML::Entities::encode()
比自己实现更容易。正如您问题的评论中所述,我不确定您到底在问什么
所以我假设您正在尝试将Unicode字符转换为HTML实体。在这种情况下,使用一个预制模块应该更好。如果由于编码问题(在Perl中非常棘手)而无法正常工作,那么问题的答案是:
没有像这样的编码选项吗
open FILE, "<", $file or die "Cannot open:$!\n", "UTF-8";
(示例改编自)
您还可以使用binmode
更改已打开的文件句柄(例如STDIN/OUT)
还可以使用pragma设置默认编码
但对于这一点,我建议尝试binmode
或更改打开的行,看看这是否解决了问题
如果您有一个perl
版本低于v5.8,那么事情就更棘手了,但是如果您告诉我们版本,可能可以解决问题
顺便说一句,我注意到了另外两件事:
- 这不是必需的,但最好使用字典范围的文件句柄(
,而不是my$fh
)文件
- 当您在
字符串上添加换行符时,它会抑制通常为帮助您查找问题而添加的行号信息die
- 如果将无法打开的文件名(或失败的SQL,或其他任何内容)放在die消息中,则调试会更容易
- 不要在Perl(5)中使用子原型。:(
)。不要把sub-uniconvert($)
/$
/@
等放在那里。它不只是检查事物,它可能会以令人困惑的方式改变意义。只需要创建新的“内置样式”操作符李>%
unicodecovert
,您需要使用utf8
来识别源代码中的Unicode字符或将其转换为数字编码,例如“\x{263a}”。:utf8是编码(UTF-8)的快捷方式“谢谢你,布莱恩。。。我通常使用':utf8'
,但在检查文档时,似乎存在差异,':编码(UTF-8)
对于输入文件来说更安全(发现它:perluniintro,Unicode I/O,就在binmode
示例的大列表下方)。。。你能澄清一下这是不是真的吗?谢谢
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;
}
open FILE, "<", $file or die "Cannot open:$!\n", "UTF-8";
open(my $fh,'<:encoding(UTF-8)', $file) or die "Error opening $file: $!";
binmode(STDOUT, ":encoding(UTF-8)");