php file_put_contents亚洲字符文件名编码

时间:2011-08-09 04:40:51

标签: php character-encoding

我正试图从维基百科中删除这些图像。如果你无法获得它,免费许可媒体有什么用呢?原始脚本为here

如果你把这个

  

http://upload.wikimedia.org/wikipedia/commons/2/26/%E7%9A%84-bw.png

在firefox中,它会立即转换为

  

http://upload.wikimedia.org/wikipedia/commons/2/26/的-bw.png

这样当您保存图像时,它会保存为的-bw.png

够简单呃?现在如何让PHP做到这一点?只是猜测,我尝试了utf8_decode($ fileName)..但是得到了错误的中文字符。

$src= "http://upload.wikimedia.org/wikipedia/commons/2/26/%E7%9A%84-bw.png";  
$pngData = file_get_contents($src);  
$fileName = basename($src);  
file_put_contents($fileName, $pngData);

任何帮助表示赞赏,因为我真的不知道从哪里开始。

2 个答案:

答案 0 :(得分:1)

您是否尝试过url_decode();

<?php
$url = 'http://upload.wikimedia.org/wikipedia/commons/2/26/%E7%9A%84-bw.png';
$parts = explode('/', $url);
$title = $parts[count($parts)-1]; //get last section

$title = urldecode($title);
?>

答案 1 :(得分:0)

Squirrelmail在源中将一个很好的函数转换为实体:

<?php 
function charset_decode_utf_8 ($string) { 
       /* Only do the slow convert if there are 8-bit characters */ 
     /* avoid using 0xA0 (\240) in ereg ranges. RH73 does not like that */ 
     if (! ereg("[\200-\237]", $string) and ! ereg("[\241-\377]", $string)) 
         return $string; 

     // decode three byte unicode characters 
     $string = preg_replace("/([\340-\357])([\200-\277])([\200-\277])/e",        
     "'&#'.((ord('\\1')-224)*4096 + (ord('\\2')-128)*64 + (ord('\\3')-128)).';'",    
     $string); 

     // decode two byte unicode characters 
     $string = preg_replace("/([\300-\337])([\200-\277])/e", 
     "'&#'.((ord('\\1')-192)*64+(ord('\\2')-128)).';'", 
     $string); 

     return $string; 
 } 
?>