PHP chr()从HTML返回菱形问号


PHP chr() returns diamond question mark from HTML

我读了很多关于这个主题的书,因为这是一个非常流行的问题,但我找不到解决方案。。。

我有一个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);
}

我可以请你投票支持我的回答吗?我是这里的新人,甚至不能以近乎零的声誉发表评论。