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

时间:2014-04-14 08:43:55

标签: php html encoding character-encoding

我已经在这个主题上阅读了很多内容,因为这是一个非常受欢迎的问题,但我无法找到解决方案......

我有一个带有表单的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值数组,每个值都将使用标准算术函数(+ / - / * ...)进行更改,之后从那些已更改的数字中获取ascii表中带有ord函数的字符...

$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 - explode等),我总是得到相同的结果,即chr(53)(显示可以&#39;的字符时显示的符号。对于数据库中的每个符号和浏览器中的输出,都可以解释为UTF-8),如果我使用特殊字符或UTF-8独有的东西,则无关紧要。我只是用标准英语字符测试它。请注意:

  • 我已将接受字符集作为UTF-8格式
  • 我通过PHP发送标题,说这是UTF-8
  • 我已经在HTML头中输入了meta标签告诉浏览器这是UTF-8
  • 我使用mb_internal_encoding完成与UTF-8一样的操作
  • 我将.php文件保存为UTF-8而没有BOM
  • mysql中的密码字段是utf-8_general_ci
  • 与数据库的连接设置为UTF-8

我现在绝望了。我非常确定我错过了一些非常简单的东西,但请帮助......

修改

我按照预期切换了ord()和chr()函数调用的位置。我以前犯了一个错误,重点是得到ascii值(int),然后将数字转换为ascii表中相应值的字符。

4 个答案:

答案 0 :(得分:1)

问题是,看看这些函数的定义:

string chr(int)
int ord(string)

你在信上使用了chr()。

答案 1 :(得分:0)

也许,你打算做这个代码会做什么?

$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);

答案 2 :(得分:0)

对不起那些因为这个可怕的问题而浪费你时间的人。三天我找了答案,但错过了我自己的错误。编码与此无关,我只是要求chr()函数显示一个不存在的值的字符。

答案 3 :(得分:0)

@Criss 你有另一个错误。 你不仅混淆了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);
}

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