我有以下代码来生成随机密码字符串:
<?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,其上方有一个^。法国什么的。这怎么可能?它只能选择我的阵列了什么!
答案 0 :(得分:4)
唯一的非ascii角色是英镑角色,所以我的猜测是它与此有关。
首先,避免使用它可能是一个好主意,因为没有多少人可以轻松输入它。
您的php文件(或编辑器设置的编码)编码与输出编码不一样的可能性很大。
答案 1 :(得分:1)
你确定它确实是一个不在你的数组中的角色,或者浏览器是否无法输出?例如你的货币英镑符号。确保PHP,DB和HTML输出都使用相同的编码。
另外,你的循环稍微复杂一些。我通常看到密码生成器随机化一个字符串与几个数组。一个简单的例子:
$chars = "abcdefghijkABCDEFG1289398$%#^&";
$pos = rand(0, strlen($chars) - 1);
$password .= $chars[$pos];
答案 2 :(得分:0)
我认为你会生成特殊的HTML字符
答案 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字符集的一部分。
您需要执行以下操作之一:
&#pound;
)