在PHP中使用两个字节代码点


Using Two Bytes Code Points in PHP

我正在编写这段代码乔恩和马里奥写的。它适用于印地语的辅音(-),但不适用于元音。一个原因可能是我无法为字母(अः)提供两个代码点

我正在尝试这些代码范围- mb - अः

// Used decimal number. 
// Error - Fatal error: Allowed memory size of 134217728 bytes
foreach (range(2309, 23092307) as $char) {
    $char = html_entity_decode("&#$char;", ENT_COMPAT, "UTF-8");
    $alphabets[$char] = ++$i;
}
print_r($alphabets);

在for循环-中也尝试了这个"foreach (range(0x0905, '0x0905 0x0903') as $char "

同样,这段代码:

// Output is Japanese/Chinese characters:
// 
function unichr($intval) {
    return mb_convert_encoding(pack('n', $intval), 'UTF-8', 'UTF-16BE');
}
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;
}
for($char = uniord('अ'); $char <= uniord('अः'); ++$char) {
    $alphabet[] = unichr($char);
}
print_r($alphabet);

看起来文件编码也有问题!现在它返回的是:Array ([0] => Array)//只有一行我已经尝试过utf-8和utf-16文档编码。

我认为这是一个大问题,因为अः没有单一的unicode代码点(字符)。相反,它是两个字符 (0x0905或十进制2309)和 (0x0903或十进制2907)的组合。

所以你的第一个代码样本循环结束点23092307是无效的。您所做的只是将两个代码点连接在一起,并将它们视为单个值。

您的第二个代码示例仅生成单个字符,因为它只是使用अः中两个代码点中的第一个,与相同。

也许你可以看看嵌套循环。让外部循环覆盖基本字符,而内部循环添加组合字符。比如:

<?php
$i = 0;
foreach (range(0x0905, 0x0938) as $char)
{
    $txt = html_entity_decode("&#$char;", ENT_COMPAT, "UTF-8");
    $alphabets[$txt] = ++$i;
    foreach ( range(0x0901, 0x0903) as $combine )
    {
        $txt = html_entity_decode("&#$char;", ENT_COMPAT, "UTF-8")
             . html_entity_decode("&#$combine;", ENT_COMPAT, "UTF-8");
        $alphabets[$txt] = ++$i;
    }
}
print_r($alphabets);
?>