我想使用阿拉伯字母作为范围函数的输入:
foreach (range('ا', 'ی') as $letter) {
echo $letter;
}
我找不到任何解决方案。
您不能使用range()来实现这一点,因为它只适用于ASCII字符,但您可以使用这个"alphabet()"函数来实现类似的功能:
/*
* By Darien Hager, Jan 2007... Use however you wish, but please
* please give credit in source comments.
*
* Change "UTF-8" to whichever encoding you are expecting to use.
*/
function ords_to_unistr($ords, $encoding = 'UTF-8') {
// Turns an array of ordinal values into a string of unicode characters
$str = '';
for ($i = 0; $i < count($ords); $i++) {
// Pack this number into a 4-byte string
// (Or multiple one-byte strings, depending on context.)
$v = $ords[$i];
$str .= pack("N",$v);
}
$str = mb_convert_encoding($str,$encoding,"UCS-4BE");
return($str);
}
function unistr_to_ords($str, $encoding = 'UTF-8') {
// Turns a string of unicode characters into an array of ordinal values,
// Even if some of those characters are multibyte.
$str = mb_convert_encoding($str,"UCS-4BE",$encoding);
$ords = array();
// Visit each unicode character
for ($i = 0; $i < mb_strlen($str,"UCS-4BE"); $i++) {
// Now we have 4 bytes. Find their total
// numeric value.
$s2 = mb_substr($str,$i,1,"UCS-4BE");
$val = unpack("N",$s2);
$ords[] = $val[1];
}
return($ords);
}
function alphabet($firstCharacter = 'A', $lastCharacter = 'Z') {
$firstCharacterValue = unistr_to_ords($firstCharacter)[0];
$lastCharacterValue = unistr_to_ords($lastCharacter)[0];
if ($firstCharacterValue < $lastCharacterValue) {
for ($character = $firstCharacterValue; $character <= $lastCharacterValue; ++$character) {
yield ords_to_unistr(array($character));
};
} else {
for ($character = $firstCharacterValue; $character >= $lastCharacterValue; --$character) {
yield ords_to_unistr(array($character));
};
}
}
然后使用
foreach (alphabet('ا', 'ی') as $letter) {
echo $letter;
}
演示
使用utf-8作为页面、数据库和服务器的主要编码(它允许您使用任何语言,而不仅仅是阿拉伯语!例如中文)
如果您使用第三方服务器,并且无法更改服务器的配置,则可以始终强制在php中进行编码
header('Content-Type: text/html; charset=utf-8');
如果您的数据库不支持UTF-8,则可以使用二进制而不是文本