PHP字符串函数与非英语语言

Sat*_*ash 5 php utf-8

我正在尝试range();使用非英语语言.它不起作用.

$i =0
foreach(range('?', '?') as $ab) {

    ++$i;

    $alphabets[$ab] = $i;

}
Run Code Online (Sandbox Code Playgroud)

输出:à= 1

这是印地语(印度)字母表.它只迭代一次(输出显示).

为此,我不知道该怎么做!

因此,如果可能的话,请告诉我该怎么做以及在考虑使用任何PHP函数的非英语文本之前我应该​​先做些什么.

Jon*_*Jon 10

简短的回答:不可能这样使用range.

说明

您将字符串'क'作为范围的开头并将'म'作为结尾.你只得到一个角色,那个角色是à.

您回来了,à因为您的源文件是以UTF-8编码(保存)的.人们可以通过à代码点来判断这一点U+00E0,同时0xE0也是UTF-8编码形式的'क'(即0xE0 0xA4 0x95)的第一个字节.可悲的是,PHP有没有编码的概念,因此它只是需要第一个字节它看到字符串,并将其用作"开始"字符.

你回来只是 à因为'म'的UTF-8编码形式也是以0xE0(因此PHP也认为"结束字符"是0xE0à)开头.

你可以写range一个for循环自己,只要有一些函数返回一个UTF-8字符(和一个没有反向)的Unicode代码点.所以我用Google搜索并在这里找到了这些:

// Returns the UTF-8 character with code point $intval
function unichr($intval) {
    return mb_convert_encoding(pack('n', $intval), 'UTF-8', 'UTF-16BE');
}

// Returns the code point for a UTF-8 character
function uniord($u) {
    $k = mb_convert_encoding($u, 'UCS-2LE', 'UTF-8');
    $k1 = ord(substr($k, 0, 1));
    $k2 = ord(substr($k, 1, 1));
    return $k2 * 256 + $k1;
}
Run Code Online (Sandbox Code Playgroud)

有了上述内容,您现在可以写:

for($char = uniord('?'); $char <= uniord('?'); ++$char) {
    $alphabet[] = unichr($char);
}

print_r($alphabet);
Run Code Online (Sandbox Code Playgroud)

看到它在行动.


mar*_*rio 5

懒惰的解决办法是使用html_entity_decode(),并range()只用于它原本打算数值范围(它的工作原理与ASCII是一个有点傻反正):

foreach (range(0x0915, 0x092E) as $char) {

    $char = html_entity_decode("&#$char;", ENT_COMPAT, "UTF-8");
    $alphabets[$char] = ++$i;
}
Run Code Online (Sandbox Code Playgroud)