我读了很多关于这个主题的书,因为这是一个非常流行的问题,但我找不到解决方案。。。
我有一个HTML,里面有表单…
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<?php
header('Content-Type: text/html; charset=utf-8');
?>
</head>
<body>
<form method="POST" accept-charset="UTF-8">
<input type="password" name="pass">
<input type="submit">
</form>
</body>
</html>
从中,我通过$_POST全局获取密码,然后想拆分成一个ascii值数组,每个值都将用标准算术函数(+/-/*…)进行更改,然后从这些更改的数字中获得带有ord函数的ascii表中的一个字符。。。
$password = $_POST['pass'];
$password = str_split($password);
foreach($password as $letter) {
$letter = ord($letter);
..do some algorithmic stuff to the number I get..
$letter = chr($letter);
}
$password = implode('', $password);
最后一步-将其放入mysql。。。
mysql_query('update some_table set password="'.$password.'" where some_value=something');
问题?无论我如何分割字符串(str_split、substr、mb_substr、preg_split、str_replace-bullet等),我总是会为数据库中的每个符号和浏览器中的输出得到相同的结果,即chr(53)(在显示无法解释为UTF-8的字符时显示的符号),即使我使用的是特殊字符还是UTF-8独有的字符也无关紧要。我只是用标准的英文字符测试过它。注意:
- 我已经在表单中将accept字符集设置为UTF-8
- 我通过PHP发送头,说这是UTF-8
- 我在HTML头中放入了元标记,告诉浏览器这是UTF-8
- 我使用mb_internal_encoding来完成所有操作,就像使用UTF-8一样
- 我将我的.php文件保存为UTF-8,不带BOM
- mysql中的密码字段为utf-8_general_ci
- 与数据库的连接设置为UTF-8
我现在很绝望。我很确定我错过了一些非常简单的事情,但请帮忙。。。
编辑
我按照预期切换了ord()和chr()函数调用的位置。我之前犯了一个错误,重点是获取ascii值(int),然后将数字转换为ascii表中相应值的字符。
问题是,看看这些函数的定义:
string chr(int)
int ord(string)
你在一封信上使用了chr()。
也许,您打算做这段代码将要做的事情?
$password = $_POST['pass'];
$password_letters = str_split($password);
$new_password_letters = array();
foreach($password_letters as $letter) {
$letter_code = ord($letter);
$letter_code++; // or do your algorithmic stuff to the number you get..
$new_letter = chr($letter_code);
$new_password_letters[] = $new_letter;
}
$new_password = implode('', $new_password_letters);
很抱歉大家在这个可怕的问题上浪费了时间。三天来,我一直在寻找答案,但没有找到自己的错误。编码与此无关,我只是要求chr()函数显示一个不存在值的字符。
@危机你又犯了一个错误。不仅混淆了ord()和chr()。但您忽略了一点,$letter实际上是要在当前循环迭代中处理的数组元素的副本,而不是$password数组本身的元素。所以这个代码
foreach($password as $letter) {
$letter = ord($letter);
..do some algorithmic stuff to the number I get..
$letter = chr($letter);
}
不会对$password进行任何更改。您应该在循环中填充另一个数组,或者以这样的方式使用foreach:
foreach ($password as $i => $letter) {
$password[$i] = your_function($letter);
}
我可以请你投票支持我的回答吗?我是这里的新人,甚至不能以近乎零的声誉发表评论。