我正在使用非英语语言尝试range();
功能。它不起作用。
$i =0
foreach(range('क', 'म') as $ab) {
++$i;
$alphabets[$ab] = $i;
}
输出:à= 1
这是印地语(印度)字母。它只迭代一次(输出显示)。
为此,我不知道该做什么!
所以,如果可能的话,请告诉我该怎么做以及在考虑使用任何PHP函数的非英语文本之前我应该先做些什么。
答案 0 :(得分:10)
简短回答:无法像这样使用range
。
您传递的是字符串'क'作为范围的开头,而'म'作为结尾。你只得到一个角色,那个角色是à
。
您回来à
因为您的源文件是以UTF-8编码(保存)的。人们可以通过à
是代码点U+00E0
来判断这一点,而0xE0
也是'क'的UTF-8编码形式的第一个字节({{1} }})。遗憾的是,PHP没有编码的概念所以它只需要在字符串中看到的第一个字节并将其用作“开始”字符。
您正在返回 0xE0 0xA4 0x95
,因为'म'的UTF-8编码形式也以à
开头(因此PHP也认为“结束字符”是0xE0
或0xE0
)。
您可以自己编写à
作为range
循环,只要有一些函数返回UTF-8字符的Unicode代码点(反向执行)。所以我用Google搜索并找到了这些here:
for
通过上述内容,您现在可以写:
// 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;
}
<强> See it in action 强>
答案 1 :(得分:5)
懒惰的解决方案是仅将html_entity_decode()
和range()
用于最初预期的数值范围(无论如何,它与ASCII一起工作有点愚蠢):
foreach (range(0x0915, 0x092E) as $char) {
$char = html_entity_decode("&#$char;", ENT_COMPAT, "UTF-8");
$alphabets[$char] = ++$i;
}
答案 2 :(得分:0)
另一个解决方案是翻译并获得范围然后再翻译。
$first = file_get_contents("http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&langpair=|en&q=क");
$second = file_get_contents("http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&langpair=|en&q=म"); //not real value
$jsonfirst = json_decode($first);
$jsonsecond = json_decode($second);
$f = $jsonfirst->responseData->translatedText;
$l = $jsonsecond->responseData->translatedText;
foreach(range($f, $l) as $ab) {
echo $ab;
}
输出
ABCDEFGHI
要翻译回来,请使用数组地图和回调函数,将每个英文值转换回印地语。