【问题标题】:UTF8 in php mysqlUTF8 在 php mysql
【发布时间】:2016-12-11 08:45:05
【问题描述】:

我正在尝试通过 php 将数据从 xls 导入 mysql。我在通过它保存 UTF-8 文本时遇到问题。我将它保存为 ???????. 我的数据库表结构是 utf8_general_ci 以及我的 php 代码如下所示

 <?php 
    $con = mysqli_connect('localhost', 'myuser', 'mypass', 'mydb');


    if(isset($_POST["submit"]))
    {
    mysqli_query($con,'SET character_set_results=utf8');
    mysqli_query($con,'SET names=utf8');
    mysqli_query($con,'SET character_set_client=utf8');
    mysqli_query($con,'SET character_set_connection=utf8');
    mysqli_query($con,'SET character_set_results=utf8');
    mysqli_query($con,'SET collation_connection=utf8_general_ci');
    $file = $_FILES['file']['tmp_name'];
    $handle = fopen($file, "r");
    $i = 0;
    while(($filesop = fgetcsv($handle, 1000, ",")) !== false)
    {	
    $option1 = $filesop[0];
    $option2 = $filesop[1];
    $option3 = $filesop[2];
    $option4 = $filesop[3];
    $correctans = $filesop[4];
    $question_text = $filesop[5];
    $cat_id = $filesop[6];
    $sub_cat_id = $filesop[7];
    $level_id = $filesop[8];
    $quesimage = $filesop[9];

    $sql = mysqli_query($con,"INSERT IGNORE INTO questions (option1, option2,option3,option4,correctans,question_text,cat_id,sub_cat_id,level_id,quesimage) VALUES ('".$option1."','".$option2."','".$option3."','".$option4."','".$correctans."','".$question_text."','".$cat_id."','".$sub_cat_id."','".$level_id."','".$quesimage."')");
    $i = $i + 1;
    	
    }
    //echo $sql;
    if($sql)
    {
    echo "You database has imported successfully. You have inserted ". $i ." records";
    }
    else
    {
    echo "Sorry!";
    }

    }
     
    ?>
    <html>
    <head>
    <title>Import Questions</title>
    </head>
    <body>
    <form method="post" action="" enctype="multipart/form-data">
    Upload Excel File : <input type="file" name="file" /><br />
    <input type="submit" name="submit" value="Upload" />
    </form>	
    </body>
    </html>

它在英文文本中运行良好,但在印地语或古吉拉特语文本中出现问题。我该如何解决?

谢谢

【问题讨论】:

  • 请尝试制作数据库的字符集:utf8_unicode_ci and ENGINE=InnoDB
  • 什么是编码使用你的xls文件?
  • @Federkun 我怎么知道?谢谢
  • 让我们看看十六进制的东西。做类似echo $question_text, bin2hex($question_text); 的事情(或一些给你带来麻烦的专栏)

标签: php mysql mysqli utf-8


【解决方案1】:

请注意,当使用fgetcsv() 函数读取数据时,会考虑locale 设置。如果LANG 是例如en_US.UTF-8,单字节编码的文件被此函数读取错误。

您可以尝试另一件事 - 即时转换您的 .csv 文档(使用您的文件编码更改 UCS-2):

function parse_csv($filename) {
    if (($handle != fopen($filename, "r"))) return false;
    while (($cols = fgetcsv($handle, 1000, "\t")) !== FALSE) {
        foreach( $cols as $key => $value ) {
            $cols[$key] = trim( $cols[$key] );
            $cols[$key] = iconv('UCS-2', 'UTF-8', $cols[$key]."\0") ;
            $cols[$key] = str_replace('""', '"', $cols[$key]);
            $cols[$key] = preg_replace("/^\"(.*)\"$/sim", "$1", $cols[$key]);
        }
        echo var_dump($cols); //This will display an array of your data
    }
}

【讨论】:

  • 你能解释一下我如何在我的代码中使用这个函数吗?谢谢
  • 我认为“UCS-2”是错误的。但是在不知道是什么生成了传入代码的情况下,我们不能说什么是正确的。
  • 您应该不必必须转换传入的文本; MySQL 几乎可以转换任何编码。
【解决方案2】:

使用与上一篇相同的想法,稍作修改:

function global_client_charset($charset){
if(!isset($charset)){
    $user_agent = strtolower($_SERVER['HTTP_USER_AGENT']);
    if(strrpos($user_agent,"linux")){
    $GLOBALS["CHARSET"] = "UTF-8";
    }else if(strrpos($user_agent,"windows")){
    $GLOBALS["CHARSET"] = "ISO-8859-1";
    }
}else{
        $GLOBALS["CHARSET"] = $charset;
}       
}

function toUTF8($data){
    if($GLOBALS["CHARSET"] === "ISO-8859-1"){
        return iconv("ISO-8859-1", "UTF-8", trim($data));
    }else if($GLOBALS["CHARSET"] === "UTF-8"){
       return trim($data);
    }else{
       return trim($data);
    }
}

if(isset($_POST["submit"]))
{
$file = $_FILES['file']['tmp_name'];
$handle = fopen($file, "r");
$i = 0;

//do you know the charset you are receiving ??
//global_client_charset("ISO-8859-1");
global_client_charset();

while(($filesop = fgetcsv($handle, 1000, ",")) !== false)
{   
    $option1 = $filesop[0];
    $option2 = $filesop[1];
    $option3 = $filesop[2];
    $option4 = $filesop[3];
    $correctans = $filesop[4];
    $question_text = $filesop[5];
    $cat_id = $filesop[6];
    $sub_cat_id = $filesop[7];
    $level_id = $filesop[8];
    $quesimage = $filesop[9];


    $query = "INSERT IGNORE INTO questions (option1, option2,option3,option4,correctans,question_text,cat_id,sub_cat_id,level_id,quesimage) VALUES ('".
    $option1."','".$option2."','".$option3."','".$option4."','".$correctans."','".$question_text."','".
    $cat_id."','".$sub_cat_id."','".$level_id."','".$quesimage."')"; 

    //echo toUTF8($query); die();
    $sql = mysqli_query($con,toUTF8($query));
    $i = $i + 1;        
}

if($sql)
{
    echo "You database has imported successfully. You have inserted ". $i ." records";
}
else
{
    echo "Sorry!";
}
}
?>
<html>
<head>
<title>Import Questions</title>
</head>
<body>
<form method="post" action="" enctype="multipart/form-data">
Upload Excel File : <input type="file" name="file" /><br />
<input type="submit" name="submit" value="Upload" />
</form> 
</body>
</html>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 2011-08-27
    • 2012-06-02
    • 1970-01-01
    • 2011-06-14
    相关资源
    最近更新 更多