php输出奇怪的字符

时间:2010-12-15 16:31:35

标签: php random

我有以下代码来生成随机密码字符串:

<?php
$password = '';

for($i=0; $i<10; $i++) {
$chars = array('lower' => array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'), 'upper' => array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'), 'num' => array('1','2','3','4','5','6','7','8','9','0'), 'sym' => array('!','£','$','%','^','&','*','(',')','-','=','+','{','}','[',']',':','@','~',';','#','<','>','?',',','.','/'));
$set = rand(1, 4); 

switch($set) {
    case 1:
        $set = 'lower';
    break;
    case 2:
        $set = 'upper';
    break;
    case 3:
        $set = 'num';
    break;
    case 4:
        $set = 'sym';
    break;
}
$count = count($chars[$set]);
$digit = rand(0, ($count-1));
$output = $chars[$set][$digit];
$password.= $output;
}
echo $password;
?>

然而,它输出的每一个字符都将是一个大写字母a,其上方有一个^。法国什么的。这怎么可能?它只能选择我的阵列了什么!

6 个答案:

答案 0 :(得分:4)

唯一的非ascii角色是英镑角色,所以我的猜测是它与此有关。

首先,避免使用它可能是一个好主意,因为没有多少人可以轻松输入它。

您的php文件(或编辑器设置的编码)编码与输出编码不一样的可能性很大。

答案 1 :(得分:1)

你确定它确实是一个不在你的数组中的角色,或者浏览器是否无法输出?例如你的货币英镑符号。确保PHP,DB和HTML输出都使用相同的编码。

另外,你的循环稍微复杂一些。我通常看到密码生成器随机化一个字符串与几个数组。一个简单的例子:

$chars = "abcdefghijkABCDEFG1289398$%#^&";
$pos = rand(0, strlen($chars) - 1);
$password .= $chars[$pos];

答案 2 :(得分:0)

我认为你会生成特殊的HTML字符

例如hereiso8859-1 table

答案 3 :(得分:0)

您可能会看到字节序列C2 A3,显示为您的大写字母A,后面跟着一个英镑符号。这是因为C2A3是英镑符号的UTF-8序列。因此,如果您已经设法在PHP文件中输入UTF-8字符(可能没有注意到它,具体取决于您的编辑器和环境),如果您的环境是ASCII / ISO8859,您会看到单独的字节序列作为输出-1或类似。

答案 4 :(得分:0)

根据Jason McCreary的说法,我使用此功能进行密码创建

function randomString($length) {
    $characters = "0123456789abcdefghijklmnopqrstuvwxyz" . 
             "ABCDEFGHIJKLMNOPQRSTUVWXYZ$%#^&";

    $string = '';    
    for ($p = 0; $p < $length; $p++) 
        $string .= $characters[mt_rand(0, strlen($characters))];
    return $string;
}   

答案 5 :(得分:0)

英镑符号(£)正在破碎,因为它不是基本ASCII字符集的一部分。

您需要执行以下操作之一:

  • 删除英镑符号(这也可以帮助使用非英国键盘的人!)
  • 将英镑符号输出到网站时将其转换为HTML实体(&#pound;
  • 将您网站的字符集编码设置为UTF-8,这将允许显示扩展字符。从长远来看,这可能是最好的选择,并且应该相当快速和容易实现。