(PHP+MySQL)在数据库中保存字符集错误,但解码正确



我可能在字符集编码/解码方面遇到了一些问题。我会尽可能详细地描述(顺便说一句,有一些带有某种GWC框架的自定义cms-使用php(,所以当用户在cms中注册并填写所有必需的字段(如名字、姓氏等(时,他会在数据库中插入"ĄČĘĮŠ280 \ŠŲžŪĖ"之类的符号,插入值为:"Česnakas",但应该像"Čes nakas"一样插入。但这并不是一切——当管理员(在CMS上(看到从数据库中获得的值时,它会正确显示(Česnakas(。

试着看看它是如何从错误的字符集转换回正确的字符集的,没有找到任何东西(通过iconv函数等进行查找(,而且,我的搜索要困难得多,因为一半的cms文件是加密的,无法读取。

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

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

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

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

注册中的代码(带插入功能(:

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;
}

感谢你的阅读(如果你读了这么长又无聊的故事(,感谢你的回答(如果有人至少想回答一些问题(。非常感谢。

每个字符本质上都只是零和一的表示,如何解释它并不重要,只要你的gui显示"正确"的一个,你就可以搜索它。

以下是对Č的一些解释

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

只要字符集能够容纳信息,并且不会"丢失"一些信息,那么你就很清楚了。

当你把信息保存在数据库中时,你基本上会发送2个字节,每个字节代表一个数字,保存在数据库和cours中。

最新更新