You can do this by using the preg_split () function.
A regular expression that provides greater compatibility is /(?<!^)(?!$)/u
$str = 'coração da programação';
preg_split("/(?<!^)(?!$)/u", $str);
I will show with the other answers are flaws or insecure regarding functionality.
Testing regular expressions proposed in other responses using string 日本語
:
$str = '日本語';
/*
Essa é a expressão regular que provê maior segurança
*/
print_r(preg_split("/(?<!^)(?!$)/u", $str));
/**
retorno:
Array
(
[0] => 日
[2] => 本
[3] => 語
)
*/
/*
Essa expressão está numa das respostas (atualmente marcada como aceita)
*/
print_r(preg_split("/./u", $str));
/*
Funciona bem com caracteres romanos, porém, não retorna corretamente com um simples kanji
Array
(
[0] =>
[1] =>
[2] =>
[3] =>
)
*/
print_r(preg_split("//u", $str));
/*
Essa outra consegue separar os caracteres, porém, retorna índices vazios no começo e no fim.
Array
(
[0] =>
[1] => 日
[2] => 本
[3] => 語
[4] =>
)
Caso queira usar a expressão "//u", deve-se adicionar alguns parâmetros caso não queira os índices com valores vazios:
*/
print_r(preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY));
/**
Retorno:
Array
(
[0] => 日
[1] => 本
[2] => 語
)
*/
Optional for quantity control of characters:
$str = '日本語';
$l = 1;
print_r(preg_split('/(.{'.$l.'})/us', $str, -1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE));
Finally, a simple routine, just traversing each character of the string and populating an array:
$str = '日本語';
$l = mb_strlen($str);
for ($i = 0; $i < $l; $i++) {
$arr[] = mb_substr($str, $i, 1);
}
print_r($arr);
// Dependendo do caso, esse pode ser mais performático que todos os outros.
// Basta saber como e quando usar os recursos da linguagem.
Note: The above examples are for environments where the character set is correctly configured.