亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 2855 | 回復(fù): 2
打印 上一主題 下一主題

LWP無(wú)法正常decode網(wǎng)頁(yè)的gb2312編碼? [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2013-06-11 21:08 |只看該作者 |倒序?yàn)g覽
事情是這樣的:
使用LWP請(qǐng)求一個(gè)gb2312編碼的網(wǎng)頁(yè),比如 http://ip138.com/ips138.asp?ip=8.8.8.8&action=2
  1. $response = LWP::UserAgent->new->get("http://ip138.com/ips138.asp?ip=8.8.8.8&action=2") ;
  2. $content = $response->decode_content() if $response->is_success;
復(fù)制代碼
按理說(shuō)應(yīng)該是得到按照gb2312解碼后的unicode字符串,實(shí)際上卻并不是,似乎是按照ISO-8859-1來(lái)處理了

如果這個(gè)decode_content真的無(wú)法正常識(shí)別gb2312的話,那模塊本身就有問(wèn)題了,但LWP是如此常用的模塊,如果有問(wèn)題早就應(yīng)該暴露出來(lái)了,所以不太敢確定是不是自己搞錯(cuò)了。貼出來(lái)希望大家也幫忙看下。

跟蹤源代碼分析,得到一些結(jié)論,貼一些關(guān)鍵性的代碼出來(lái)。

首先decode_content函數(shù)
  1. if ($self->content_is_text || (my $is_xml = $self->content_is_xml)) {
  2.             my $charset = lc(
  3.                 $opt{charset} ||
  4.                 $self->content_type_charset ||
  5.                 $opt{default_charset} ||
  6.                 $self->content_charset ||
  7.                 "ISO-8859-1"
  8.             );
復(fù)制代碼
由于網(wǎng)頁(yè)并沒(méi)有在http頭部添加charset的param 而是在html文檔里設(shè)置了<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
因此HTTP::Message模塊也支持從meta標(biāo)簽里識(shí)別這個(gè)編碼。上面的if流程執(zhí)行下來(lái)
$opt{charset} 未設(shè)定,$self->content_type_charset沒(méi)有得到編碼,$opt{default_charset}未設(shè)定。$self->content_charset應(yīng)該得到gb2312才對(duì),但實(shí)際上用
$response->content_charset還是得到了undef,跟蹤content_charset()函數(shù),一些關(guān)鍵代碼:
  1. elsif ($self->content_is_html) {
  2.         # look for <META charset="..."> or <META content="...">
  3.         # http://dev.w3.org/html5/spec/Overview.html#determining-the-character-encoding
  4.         require IO::HTML;
  5.         # Use relaxed search to match previous versions of HTTP::Message:
  6.         my $encoding = IO::HTML::find_charset_in($cref, { encoding    => 1,
  7.                                                            need_pragma => 0 });
  8.         return $encoding->mime_name if $encoding;
  9.     }
復(fù)制代碼
發(fā)現(xiàn)my $encoding = IO::HTML::find_charset_in已經(jīng)正確的返回了encode對(duì)象,但$encoding->mime_name返回確實(shí)空。$encoding->name卻是正確的“euc-cn”

繼續(xù)跟蹤mime_name,實(shí)際上調(diào)用的是return Encode::MIME::Name::get_mime_name,關(guān)鍵代碼:
  1. our %MIME_NAME_OF = (
  2.     'AdobeStandardEncoding' => 'Adobe-Standard-Encoding',
  3.     'AdobeSymbol'           => 'Adobe-Symbol-Encoding',
  4.     'ascii'                 => 'US-ASCII',
  5.     'big5-hkscs'            => 'Big5-HKSCS',
  6.     'cp1026'                => 'IBM1026',
  7.     'cp1047'                => 'IBM1047',
  8.     'cp1250'                => 'windows-1250',
  9.     'cp1251'                => 'windows-1251',
  10.     'cp1252'                => 'windows-1252',
  11.     'cp1253'                => 'windows-1253',
  12.     'cp1254'                => 'windows-1254',
  13.     'cp1255'                => 'windows-1255',
  14.     'cp1256'                => 'windows-1256',
  15.     'cp1257'                => 'windows-1257',
  16.     'cp1258'                => 'windows-1258',
  17.     'cp37'                  => 'IBM037',
  18.     'cp424'                 => 'IBM424',
  19.     'cp437'                 => 'IBM437',
  20.     'cp500'                 => 'IBM500',
  21.     'cp775'                 => 'IBM775',
  22.     'cp850'                 => 'IBM850',
  23.     'cp852'                 => 'IBM852',
  24.     'cp855'                 => 'IBM855',
  25.     'cp857'                 => 'IBM857',
  26.     'cp860'                 => 'IBM860',
  27.     'cp861'                 => 'IBM861',
  28.     'cp862'                 => 'IBM862',
  29.     'cp863'                 => 'IBM863',
  30.     'cp864'                 => 'IBM864',
  31.     'cp865'                 => 'IBM865',
  32.     'cp866'                 => 'IBM866',
  33.     'cp869'                 => 'IBM869',
  34.     'cp936'                 => 'GBK',
  35.     'euc-jp'                => 'EUC-JP',
  36.     'euc-kr'                => 'EUC-KR',
  37.     #'gb2312-raw'            => 'GB2312', # no, you're wrong, I18N::Charset
  38.     'hp-roman8'             => 'hp-roman8',
  39.     'hz'                    => 'HZ-GB-2312',
  40.     'iso-2022-jp'           => 'ISO-2022-JP',
  41.     'iso-2022-jp-1'         => 'ISO-2022-JP',
  42.     'iso-2022-kr'           => 'ISO-2022-KR',
  43.     'iso-8859-1'            => 'ISO-8859-1',
  44.     'iso-8859-10'           => 'ISO-8859-10',
  45.     'iso-8859-13'           => 'ISO-8859-13',
  46.     'iso-8859-14'           => 'ISO-8859-14',
  47.     'iso-8859-15'           => 'ISO-8859-15',
  48.     'iso-8859-16'           => 'ISO-8859-16',
  49.     'iso-8859-2'            => 'ISO-8859-2',
  50.     'iso-8859-3'            => 'ISO-8859-3',
  51.     'iso-8859-4'            => 'ISO-8859-4',
  52.     'iso-8859-5'            => 'ISO-8859-5',
  53.     'iso-8859-6'            => 'ISO-8859-6',
  54.     'iso-8859-7'            => 'ISO-8859-7',
  55.     'iso-8859-8'            => 'ISO-8859-8',
  56.     'iso-8859-9'            => 'ISO-8859-9',
  57.     #'jis0201-raw'           => 'JIS_X0201',
  58.     #'jis0208-raw'           => 'JIS_C6226-1983',
  59.     #'jis0212-raw'           => 'JIS_X0212-1990',
  60.     'koi8-r'                => 'KOI8-R',
  61.     'koi8-u'                => 'KOI8-U',
  62.     #'ksc5601-raw'           => 'KS_C_5601-1987',
  63.     'shiftjis'              => 'Shift_JIS',
  64.     'UTF-16'                => 'UTF-16',
  65.     'UTF-16BE'              => 'UTF-16BE',
  66.     'UTF-16LE'              => 'UTF-16LE',
  67.     'UTF-32'                => 'UTF-32',
  68.     'UTF-32BE'              => 'UTF-32BE',
  69.     'UTF-32LE'              => 'UTF-32LE',
  70.     'UTF-7'                 => 'UTF-7',
  71.     'utf8'                  => 'UTF-8',
  72.     'utf-8-strict'          => 'UTF-8',
  73.     'viscii'                => 'VISCII',
  74. );

  75. sub get_mime_name($) { $MIME_NAME_OF{$_[0]} };
復(fù)制代碼
可以看到 Encode::MIME::Name里根本沒(méi)有euc-cn對(duì)應(yīng)的mime_name,查了下IANA官方的charset文檔:
http://www.iana.org/assignments/character-sets/character-sets.xml 里面也確實(shí)沒(méi)有。

難道說(shuō)真的是HTTP::Message里的源代碼寫的有問(wèn)題么?。。。

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2013-06-12 10:53 |只看該作者
my %opts = (charset_strict  => 1,         
            default_charset => 'cp936',
           );
$content = $response->decoded_content( %opts );

自己設(shè)定行不?

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2013-06-12 14:32 |只看該作者
回復(fù) 2# cronas


    自己設(shè)定當(dāng)然可以,但這不是問(wèn)題的關(guān)鍵
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP