Так вот, еще при работе над своим виджетом (приложением) To Do я заметил, что для обработки строк русских букв обычные строковые функции PHP не подходят, например если надо было узнать длину слова, скажем: ВАСЯ, то выяснялось, что его длина при применении функции strlen будет равна 8, а не 4 и всё-бы ни чего, просто дели длину на 2 и всё будет окей, но например длина фразы в которой есть и русские и англ.буквы или спец.символы (хотя-бы даже пробел) уже таким способом правильно определяться не будет!В кодировке UTF-8 унаследованы однобайтные (точнее, 7-битные) коды символов ASCII-7 (коды от 0 до 127), т.е. одним байтом кодируются латинские буквы, цифры и специальные символы. Русские буквы (кириллица) представляются 16-битными (двухбайтными) кодами
А вот для этих целей, как раз, есть: Строковые функции Multibyte - в принципе тут доступно описано, суть в изменении наименования функции - чаще всего добавление mb_ в начале. Ну и нужно не забыть указать для PHP с чем он будет работать далее в коде - mb_internal_encoding("UTF-8");
Применив это всё там (в To Do) я и почти забыл про это и тут.....
Некоторое время я не пользовался Android приложением MajorDroid, а тут включив его и начав голосовое управление, я обнаружил, что Google стал по другому возвращать некоторые распознанные фразы, а именно произнесенное слово "включи" выдается именно как Включи (с большой буквы), а слово "включить" - как включить (с маленькой).
И всё бы ничего, можно было, конечно, отлавливать это в шаблонах в строках поиска (либо через "или" либо еще вывернуться), но у меня например шаблон Включи или выключи это один шаблон, а не два и что именно сделать определяется внутри. Обращаю внимание, что сам начальный контекст системой обрабатывается правильно - т.е. у меня шаблон: (^включи|^выключи) отрабатывает правильно, не зависимо от того заглавная первая буква или прописная, но внутри зависимые шаблоны должны были разобраться, что от них всё-таки хотят: включить или выключить.
Дак вот был, и ранее как мне казалось, успешно работал например этот код:
Код: Выделить всё
if (preg_match('/включи/is',$original)) {
say('Включаю передачу звука в сеть WiFi',1);
runScript('audio_wifi_start');
} elseif (preg_match('/выключи/is',$original)) {
say('Выключаю передачу звука в сеть WiFi',1);
runScript('audio_wifi_stop');
} else {
say('Непонятно что: '.$original,1);
}
Что я предпринимал, чтобы решить эту проблему:
1) добавил mb_internal_encoding("UTF-8");
2) функцию preg_match заменил на mb_ereg_match
но НЕ РАБОТАЕТ так всё-равно!
Пока конечно поступил не красиво, а именно так:
Код: Выделить всё
if (preg_match('/включи/is',$original)||preg_match('/Включи/is',$original)) {.......
может надо, что-то в php.ini подправить (добавить)?