PHP:将非ISO-8859-1字符编码到utf8中

时间:2013-08-11 09:20:32

标签: php utf-8 cyrillic

我想知道怎样才能将俄语/印地语/中文...加入到utf8中。我知道函数utf8_decode / utf8_encode,但它们只适用于ISO-8859-1。

在php中是否有更通用的功能,它可以与任何类型的字符执行相同的任务?如果我想编码/解码俄语字符,我应该使用哪一个?

我也试过这个:mb_convert_encoding($ string,'UTF-8','CP1251');

但它不起作用,它会转换:РкРеаа

编辑:

我正在使用的脚本是一个非常简单的表单,用户必须填写这些表单才能将一些信息存储到数据库中:

<?php header('Content-Type: text/html; charset=utf-8'); //To specify to the browser the kind of content


$con = mysql_connect('**host**', '**user**', '**pass**');
mysql_select_db('encoding_test', $con);
mysql_set_charset('utf8', $con);

if($_POST['submitted']){

    //<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> this should go up


    $name2= $_POST['name'];
    echo $name2."<br>";


    /* The name I'm inserting in the form is the following one
    $name="Екатеринка";
    */

    require_once('mysqli_connect.php');

    $q="INSERT INTO USERS (name,pass) VALUES ('$name2' ,'pass')";


    $r = @mysqli_query($dbc, $q); //Here we run the query

    if($r)
    {

        echo 'Everything OK '.$q.'<br>';

    }else{

        echo 'Something wrong<br>';
        echo '<p>'.mysqli_error($dbc).'<br /><br />Query:'.$q.'</p>';

    }



}//Lo del submmited que hay que elminar al final de las pruebas

?>

<html xml:lang=en ""lang="en">
    <head>

        <title>Register From</title>
        <h1>Register From</h1>

    </head>
    <body>
        <form action="Main_menu.php" accept-charset="utf-8" method="post">

            <p>First Name: <input type="text" name="name" size="15" maxlength="20"  /></p>
            <p>Password: <input type="password" name="pass" size="15" maxlength="20"  /></p>

            <p><input type="submit" name="submit" value="Register" /></p>
            <input type="hidden" name="submitted" value="TRUE" />

        </form>
    </body>
</html>

在数据库中创建表的代码是:

require_once('../mysqli_connect.php');

//We create now the USERS table
$q="CREATE TABLE USERS(user_id
MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(30) NOT
NULL, email VARCHAR(80) NOT NULL, pass VARCHAR(30) NOT
NULL, PRIMARY KEY (user_id)) ENGINE=MyISAM DEFAULT CHARSET=utf8";

$r = @mysqli_query($dbc, $q); //Here we run the query

当我执行脚本时,一切正常,它与数据库连接,显示的消息是:

一切都可以插入用户(名称)VALUES('Екатеринка')

然后我去了数据库,存储的信息是:ЕкаÑ,Ðμринка... 但是,如果我复制并粘贴数据库的SQL提示“Everything OK INSERT INTO USERS(name)VALUES('Екатеринка')”并按回车键,则存储的信息为Екатеринка。

在阅读dezece的帖子之前:kunststube.net/frontback。我认为问题不在我的脚本中,因为西里尔字符显示正确,不在数据库中,因为如果我使用它自己的SQL提示,它们是正确存储的,所以问题必须在浏览器和数据库之间的连接中。

除此之外我还应该尝试别的东西:

$con = mysql_connect('**host**', '**user**', '**pass**');
    mysql_select_db('encoding_test', $con);
    mysql_set_charset('utf8', $con);

**在我的剧本中,我正在使用真实的信息

编辑2:

我添加了几行,只是为了检查从数据库中检索信息的方式:

$q="SELECT name FROM USERS WHERE pass='pass'"; 

$r=@mysqli_query($dbc, $q);

$row=mysqli_fetch_array($r, MYSQLI_ASSOC);

echo "We get from the Database: ".$row['name']."<br>";

结果是:“我们从数据库中获取:Екатеринка”

因此,尽管信息存储在表格中,但至少可以很好地检索到它

1 个答案:

答案 0 :(得分:3)

iconv和mb_convert_encoding函数将字符串从一种编码转换为另一种编码。例如,要将文本从ISO-8859-2转换为UTF-8,您可以使用:

$text = iconv("ISO-8859-2", "UTF-8", $text);
$str = mb_convert_encoding($str, "UTF-8", "ISO-8859-2");

要使用它们,您必须知道原始编码。

要在浏览器中查看UTF-8编码文本,请发送内容类型标题:

header("Content-Type: text/html; charset=UTF-8");