首页 > 解决方案 > (PHP+MySQL) 在数据库中保存字符集错误,但解码正确

问题描述

我可能对字符集编码/解码有一些问题。将尝试尽可能详细地描述(顺便说一句 - 有带有某种 GWC 框架的自定义 cms - 使用 php),所以当用户在 CMS 中注册并填写所有必填字段(如名字、姓氏等)时,他是在数据库中插入像“ĄČĘĮŠĘŠŲŽŪĖ”这样的符号,在数据库中插入像“Äesnakas”这样的值,但应该像“Česnakas”一样插入。但这还不是全部——当管理员(在 CMS 上)看到从数据库中获取的值时——它会正确显示(Česnakas)。

试图查看它如何从错误的字符集转换回正确的字符集,没有找到任何东西(通过 iconv 函数等查找),而且,我的搜索更加困难,因为一半的 cms 文件被加密且不可读。

在某些地方插入了带有字符集 UTF-8 和 Windows-1257 的标头,但这对我没有多大帮助。

我尝试了这些方法将所有字符转换为正确的字符:

更改了数据库行排序规则(从 latin1_swedish.. 到 utf8_general_ci;utf8_unicode_520(和 _ci)) - 没有帮助。从数据库中导出并尝试使用 excel 转换 UTF-8 字符集中的所有数据 - 仍然得到这些错误字符。(尝试了几种方法,以及几种不同的字符集)

主要问题 - 是否有可能(如果是 - 如何?)在 DB 中转换这些字符?否则,如果不是,如何识别框架如何解码所有字符并显示正确的字符,以防构建将从数据库中获取所有数据的函数 - 解码(到正确的符号),以正确的字符集将其存储到数据库中(如:get -> 转换 -> 将其发送回原来的位置 -> 保存)。

注册代码(插入功能):

function RegistrationAdd () {
if (($GLOBALS[fmMemberFirstName] != "") && ($GLOBALS[fmMemberLastName] != "") && ($GLOBALS[fmMemberPhone1] != "")) {
    if (CheckCaptcha ($GLOBALS[captcha])) {
        if (checkemail($GLOBALS[fmMemberMail])) {

        mysql_select_db($GLOBALS["DBName"]);

        $new_pass = GenerateKey(8);

        $strQuery = "INSERT INTO gwc_members VALUES ('','".$GLOBALS[fmMemberLogin]."','".md5($new_pass)."','".$GLOBALS[fmMemberMail]."','".$GLOBALS[fmMemberFirstName]."','".$GLOBALS[fmMemberLastName]."','".$GLOBALS[fmMemberPhone1]."','".$GLOBALS[fmMemberPhone2]."','".$GLOBALS[fmMemberAddress1]."','".$GLOBALS[fmMemberAddress2]."','".$GLOBALS[fmMemberZipCode]."','".$GLOBALS[fmMemberCity]."','".$GLOBALS[fmMemberCountry]."','".$GLOBALS[fmMemberJob]."','".$GLOBALS[fmMemberImone]."','".$GLOBALS[fmMemberKodas]."','".$GLOBALS[fmMemberPvm]."','".$GLOBALS[fmMemberAdresas1]."','".$GLOBALS[fmMemberAdresas2]."','".$GLOBALS[fmMemberTelefonas]."','4', '".$GLOBALS[fmMemberValiuta]."', '".date ('Y-m-d H:i:s')."','1','0')";


        mysql_query($strQuery);

        echo "<br>
        <table border=\"0\" width=\"100%\" align=\"center\" cellspacing=\"1\" cellpadding=\"2\">
          <tr>
            <td width=\"100%\" valign=\"top\" align=\"center\">Welcome message<br />E-mail  $GLOBALS[fmMemberMail]</td>
          </tr>
        </table>
        <META HTTP-EQUIV=\"REFRESH\" CONTENT=\"3;URL=index.php?langid=$GLOBALS[GP_langid]&stepto=memberarea&page=login\">
        ";
        } else {
            echo "<br>
            <table border=\"0\" width=\"100%\" align=\"center\" cellspacing=\"1\" cellpadding=\"2\">
              <tr>
                <td width=\"100%\" valign=\"top\" align=\"center\"><font color=\"red\">".lang_2070."</font><br /><br />
            <a href=\"javascript:history.back()\">".lang_2071."</a></td>
              </tr>
            </table>
            ";
        }
    } else {
        echo "<br>
        <table border=\"0\" width=\"100%\" align=\"center\" cellspacing=\"1\" cellpadding=\"2\">
          <tr>
            <td width=\"100%\" valign=\"top\" align=\"center\"><font color=\"red\">".lang_2080."</font><br>
            <a href=\"javascript:history.back()\">".lang_2071."</a>
            </td>
          </tr>
        </table>
        ";
    }
} else {
echo "<br>
<table border=\"0\" width=\"100%\" align=\"center\" cellspacing=\"1\" cellpadding=\"2\">
  <tr>
    <td width=\"100%\" valign=\"top\" align=\"center\"><font color=\"red\">".lang_2072."</font><br /><br />
    <a href=\"javascript:history.back()\">".lang_2071."</a>
    </td>
  </tr>
</table>
";
}
}

可以查看会员信息的页面(并正确显示字符):

function MemberView ()
{
echo "<table border=\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"2\">
  <tr>
    <td width=\"100%\" valign=\"top\" align=\"center\" class=\"ActionNameTitle\">[ Kliento informacija ]</td>
  </tr>
</table>
";

$strQuery = "SELECT * FROM gwc_members where member_id='".$GLOBALS[GP_memberid]."'";

mysql_select_db($GLOBALS["DBName"]);
$result = mysql_query($strQuery);

while ($rs = mysql_fetch_array ($result)) {

$usergroup = $rs["usergroup"];

echo "<table border=\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"2\" class=\"RecordListBox\">
  <tr>
    <td width=\"200\" valign=\"top\">Vardas, pavardė</td>
    <td width=\"*\" valign=\"top\">$rs[member_firstname] $rs[member_lastname]</td>
  </tr>
</table>
<br>
";
}
mysql_free_result ($result);
} 

某种名称生成:

function GenerateName($count) {
mt_srand((double)microtime()*1000000);
 $key = "";
 for ($i=0; $i<$count; $i++) {
   $c = mt_rand(0,2);
   if ($c==0) {
     $key .= mt_rand(0,9);
   } elseif ($c==1) {
     $key .= mt_rand(0,9);
   } else {
     $key .= mt_rand(0,9);
   }
 }
 return $key;
}

欣赏阅读(如果您阅读了所有这些冗长而无聊的故事)和答案(如果有人愿意至少回答一些问题)。谢谢!

标签: phpmysqlutf-8character-encoding

解决方案


每个字符本质上只是零和一的表示,它的解释方式并不重要,只要您的 gui 显示“正确”的字符并且您可以搜索它。

以下是对Č的一些解释

Letter    Č 
UTF8      U+010C 
Binary    11000100:10001100    
DECIMAL   268

只要字符集可以保存信息并且不会“丢失”某些信息,您就可以清楚地了解。

当您将信息保存在数据库中时,您基本上发送了 2 个字节,每个字节代表一个数字,并且保存在数据库中。


推荐阅读