Функция PHP String с неанглийскими языками

Я пытался 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 и функцию обратного вызова, которая переводит каждое из английских значений обратно на хинди.