ircmaxell / RandomLib

A library for generating random numbers and strings
MIT License
841 stars 116 forks source link

Compatibility with multibyte characters #21

Open Trainmaster opened 10 years ago

Trainmaster commented 10 years ago
$factory = new RandomLib\Factory;
$generator = $factory->getGenerator(new SecurityLib\Strength(SecurityLib\Strength::MEDIUM));

var_dump($generator->generateString(8, 'abc'));
// string(8) "bbcaaacb"

var_dump($generator->generateString(8, 'äöü'));
// string(8) "ö¼Ã¤Ã¼¶"

var_dump($generator->generateString(8, 'a'));
// string(0) ""

var_dump($generator->generateString(8, 'ä'));
// string(8) "¤¤Ã¤¤¤Ã¤"
ircmaxell commented 10 years ago

In general, this will not be solvable unless significant constraints are put on the character set. As in make that a 3rd option to the method. This would require abstracting mb_string and intl, as we're not sure if they are available, and which one is.

Which means it's definitely possible, but it's not trivial. I'd suggest in the mean time doing it yourself:

$string = "";
$chars = "äöü";
$len = mb_strlen($chars, "utf-8");
for ($i = 0; $i < 8; $i++) {
    $string .= $chars[$generator->generateInt(0, $len)];
}