首页 > 编程技术 > php

php utf8编码上传中文文件名出现乱码

发布时间:2016-11-25 17:39

下面我来总结一下php utf8编码上传中文文件名出现乱码解决办法,有碰这类问题的朋友可参考参考。
 代码如下 复制代码

<?php 
if(isset($_FILES['file'])){ 
$upload='upload/'.$_FILES['file']['name']; 

if(is_uploaded_file($_FILES['file']['tmp_name'])){ 

//iconv函数解决上传文件中文名乱码的问题,但是不提倡文件名是中文的,特别是unix/linux环境下 ,当你要输出的时候,又要给变回来,iconv('gb2312',UTF-8',$upload)

if(!move_uploaded_file($_FILES['file']['tmp_name'],iconv('UTF-8','gb2312',$upload))){ 

echo 'failed'; 

}else{ 
echo 'success'; 



else{ 
echo 'failed'; 


?> 

/******关于iconv函数的应用:string iconv ( string in_charset, string out_charset, string str )
* in_charset:传入的文件的格式

* out_charset:输出的文件的格式

* str:文件路径

*****/

在php中如果我们不作任何设置一般情况下利用date输出时间是会有误差的,而且很大。

问题:echo date('o-m-j H:i');

 代码如下 复制代码

〈?php
         echo date(’Y-m-d H:i:s’);
  ?〉


输出当前时间:2008-10-12 02:32:17
怪了,实际时间是:2008-10-12 10:32:17

输出结果与本地时间相差8小时。
原因:时区未正确设置。
两种解决方法:

1.加入date_default_timezone_set('Asia/Shanghai');
2. 修改php.ini

[Date]

; Defines the default timezone used by the date functions
date.timezone = PRC 注:PRC为中化人民共和国

如果没有修改php.ini的权限,那么应该在调用date()方法之前加上

 代码如下 复制代码
date_default_timezone_set(‘PRC’);
如果ASCii码大于0xa0就是半个汉字;了解substr()、mb_substr()、ord()。 现在常用的编码格式是UTF8,GBK,GBK2312,BIG5。GBK是GBK2312的升级。现在我开发中遇到的基本都是UTF8,GBK常用在论坛BBS上。今天自己写了下UTF8的,测试下还说的过去,毕竟从网上拷下来的是可以用,但是如果有时间最好还是自己写一下,这样只有到自己手里的才是自己的。

最简的就是利用

例子 1

 代码如下 复制代码

<?php
echo substr("Hello world!",6);
?>输出:

world!

例子 2
<?php
echo substr("Hello world!",6,5);
?>

英文的话没有问题,但是中文就出问题了,下面我们使用mb_substr函数处理。

/**
*—————————————————————————————————————–
*PHP有一个mbstring扩展库可以用(有朋友面试PHP的时候还被问到过这个问题哦),但是  *
一般的服务器都没打开php_mbstring.dll,需要在
*php.ini里把php_mbstring.dll打开,如果没有权限的话就只有联系你的ISP了。
*因为mb_string的效率高一些,所以我们先检查一下mb_string是否可以用:
*—————————————————————————————————————–
*/

 代码如下 复制代码

if(function_exists(‘mb_string’))
{
mb_substr($string,$start,$length,$encoding);
//other codes here
}
else mysubstr($string,$start,$length);// 调用自己的函数
?>

首先定义自己的函数

 代码如下 复制代码

<?php
/**
*———————————-
*首先定义自己的函数:
*———————————-
*/
function mysubstr($string, $start, $length)
{
if(strlen($string)>$length)
{
$str=”;
$len=$start+$length;
for($i=$start;$i<$len;$i++)
{
if(ord(substr($string,$i,1))>0xa0)
{
$str.=substr($string,$i,2);
$i++;
}
else{ $str.=substr($string,$i,1);}
}
return $str.’…’;
}
else{ return $string;}
}

 

还有一个问题要注意,使用这种方法的时候,你的<head>标签对里的charset只有设成中文的编码才可以,如GBK,GB2312。

下面自己常用的一个中英文字符截取函数

自定义截取中文字符串函数,基本上就是仿照mb_substr写个函数,直接调用罢了,以下为我找到的代码,其实很简单

 代码如下 复制代码

<?php 
function  substr_cn($string_input,$start,$length)
{
    /* 功能:
     * 此算法用于截取中文字符串
     * 函数以单个完整字符为单位进行截取,即一个英文字符和一个中文字符均表示一个单位长度
     * 参数:
     * 参数$string为要截取的字符串,
     * 参数$start为欲截取的起始位置,
     * 参数$length为要截取的字符个数(一个汉字或英文字符都算一个)
     * 返回值:
     * 返回截取结果字符串
     * */
    $str_input=$string_input;
    $len=$length;
    $return_str="";
    //定义空字符串
    for ($i=0;$i<2*$len+2;$i++)
        $return_str=$return_str." ";
    $start_index=0;
    //计算起始字节偏移量
    for ($i=0;$i<$start;$i++)
    {
        if (ord($str_input{$start_index}>=161))          //是汉语     
        {
            $start_index+=2;
        }
        else                                          //是英文
        {
            $start_index+=1;
        }        
    }    
    $chr_index=$start_index;
    //截取
    for ($i=0;$i<$len;$i++)
    {
        $asc=ord($str_input{$chr_index});
        if ($asc>=161)
        {
            $return_str{$i}=chr($asc);
            $return_str{$i+1}=chr(ord($str_input{$chr_index+1}));
            $len+=1; //结束条件加1
            $i++;    //位置偏移量加1
            $chr_index+=2;
            continue;            
        }
        else 
        {
            $return_str{$i}=chr($asc);
            $chr_index+=1;
        }
    }    
    return trim($return_str);
}//end of substr_cn
?>

preg_match正则匹配的字符串中会出现一些问题,下面我来给大家介绍一下怎么来解决长字符串时出现错误观点的解决办法。

preg_match_all正则匹配字符串所有连接地址

 代码如下 复制代码

$str ='<a href="http://www.a.com/2010/11-15/5.html">4</a>
  <a href="http://www.b.com/2010/11-15/6.html">5</a>
  <a href="http://www.b.com/2010/11-15/1.html">6</a>
  ';

$ymd=date("y")."/".date("m-d");
$b = preg_match_all('/<a href="(.*?)com/'.$ymd.'(.*?)html">(.*?)</a>/',$a,$c,preg_set_order);


但是用preg_match正则提取目标内容,死活有问题,

代码测得死去活来。
后来发现“pcre.backtrack_limit ”的值默认只设了100000。

解决办法:

 代码如下 复制代码


ini_set(‘pcre.backtrack_limit’, 999999999);


注:这个参数在php 5.2.0版本之后可用。

另外说说关于:pcre.recursion_limit
pcre.recursion_limit是PCRE的递归限制,这个项如果设很大的值,会消耗所有进程的可用堆栈,最后导致PHP崩溃。
也可以通过修改配置来限制

 代码如下 复制代码

ini_set(‘pcre.recursion_limit’, 99999);

实际项目应用中,最好也对内存进行限定设置:

 代码如下 复制代码

ini_set(‘memory_limit’, ’64M’);

XAMPP 的 phpMyAdmin 就会有文件大小限制、上传超时等各种问题,有一种解决办法是修改配置文件,但是我今天要推荐的是另一种方法 —— shell 命令,更加快速、直接、有效地导入数据库,可以从根本上避免文件大小限制、上传超时等问题。

有数据库服务器管理权限


找到php.ini 配置文件中的以下三个地方,upload_max_filesize, memory_limit 和post_max_size 修改大小即可。


利用命令来解决步骤如下:

第一,打开 CMD。开始 -> 运行 -> CMD。

第二,进入 mysql 目录。

 代码如下 复制代码

d:
cd d:xamppmysqlbin

第三,启动 mysql,输入用户名及密码。

 代码如下 复制代码

mysql -u wper -p
Enter password: *******

第四,选择对应的数据库名。

mysql> use wp
第五,设置 utf8 编码。

 代码如下 复制代码

mysql> set names utf8;

第六,选择 sql 数据库文件路径并导入。

 代码如下 复制代码

mysql>source d:wangeim.sql

方法三,利用一些专用的数据备份软件,这样他们可以设置导出数据的大小这样就可以解决这个问题了。

标签:[!--infotagslink--]

您可能感兴趣的文章: