我正在尝试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)
懒惰的解决办法是使用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)
| 归档时间: |
|
| 查看次数: |
1626 次 |
| 最近记录: |