Я пытался range();
с неанглийским языком. Это не работает.
$i =0 foreach(range('क', 'म') as $ab) { ++$i; $alphabets[$ab] = $i; }
Выход : à = 1
Это были хинди (Индия). Он выполняется только один раз (отображается вывод).
Для этого я не понимаю, что делать!
Поэтому, если это возможно, скажите, пожалуйста, что мне делать, и что я должен сделать сначала, прежде чем думать о работе с текстом, отличным от английского, с любыми функциями PHP.
Короткий ответ: использовать такой range
невозможно.
Вы передаете строку «क» в качестве начала диапазона и «म» в качестве конца. Вы получаете только один символ, и этот символ – à
.
Вы возвращаетесь назад, потому что ваш исходный файл закодирован (сохранен) в UTF-8. U+00E0
этом можно судить по тому, что à
является кодовой точкой U+00E0
, а U+00E0
также является первым байтом кодированной UTF-8 формы 'क' (которая равна 0xE0 0xA4 0x95
). К сожалению, PHP не имеет понятия кодировок, поэтому он просто берет первый байт, который он видит в строке, и использует это как символ «start».
Вы возвращаетесь только к, потому что кодированная форма UTF-8 'म' также начинается с 0xE0
(поэтому PHP также считает, что «конечный символ» равен 0xE0
или à
).
Вы можете писать range
как цикл for
самостоятельно, если есть некоторая функция, которая возвращает кодовую точку Unicode символа UTF-8 (и тот, который делает обратное). Итак, я нашел googled и нашел их здесь :
// 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; }
С вышесказанным вы можете теперь написать:
for($char = uniord('क'); $char <= uniord('म'); ++$char) { $alphabet[] = unichr($char); } print_r($alphabet);
Смотрите в действии .
html_entity_decode()
решением будет использование html_entity_decode()
и range()
только для числовых диапазонов, изначально предназначенных (что он работает с ASCII, в любом случае, это немного глупо):
foreach (range(0x0915, 0x092E) as $char) { $char = html_entity_decode("&#$char;", ENT_COMPAT, "UTF-8"); $alphabets[$char] = ++$i; }
Другим решением будет перевод и получение диапазона, а затем перевод обратно.
$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
Чтобы перевести назад, используйте arraymap и функцию обратного вызова, которая переводит каждое из английских значений обратно на хинди.