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

时间:2011-10-23 06:33:56

标签: php unicode utf-8

我正在研究code 由乔恩和马里奥撰写。它适用于印地语(क - ह)的辅音,但不适用于元音。一个原因可能是我无法为字母(अः)

提供两个代码点

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

// 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(范围(0x0905,'0x0905 0x0903')为$ 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);

它看起来也有文件编码的东西!现在它正在返回: 数组([0] =&gt;अ)//只有一行 我尝试过使用utf-8和utf-16文档编码。

1 个答案:

答案 0 :(得分:1)

我认为这是一个很大的问题,因为अः没有单一的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);
?>