php - (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;
}
欣赏阅读(如果您阅读了所有这些冗长而无聊的故事)和答案(如果有人愿意至少回答一些问题)。谢谢!
解决方案
每个字符本质上只是零和一的表示,它的解释方式并不重要,只要您的 gui 显示“正确”的字符并且您可以搜索它。
以下是对Č的一些解释
Letter Č
UTF8 U+010C
Binary 11000100:10001100
DECIMAL 268
只要字符集可以保存信息并且不会“丢失”某些信息,您就可以清楚地了解。
当您将信息保存在数据库中时,您基本上发送了 2 个字节,每个字节代表一个数字,并且保存在数据库中。
推荐阅读
- java - 在 PDF Android App 上标记
- c# - 使用仅 HTTP 会话 cookie 时,客户端如何知道其会话何时到期?
- filter - 如何根据规则排列特定单元格?
- pandas - 将宽大的熊猫数据框转换/重塑为长/表格形式?
- dynamic-programming - 同时子集和
- reactjs - 反应模态不显示
- sql-server - 按每个客户的订单和每个订单的项目对客户进行排名
- javascript - 无法从 Web 服务中检索 XML 列表
- javascript - 使用javascript将平面数组转换为嵌套数组
- python - 如何在使用 super() 访问基类方法时覆盖两个相互调用的方法?