Возможно, вам придется сообщить Perl, что ваш исходный файл содержит символы utf8.Попробуйте:
#!/usr/bin/perl
use utf8; # **** Add this line
$str = 'mısır';
$str =~ m/m[ıi]s[ıi]r/ && print "match double undotted ı\n";
Что не помогает вам с PHP, но в PHP может быть похожая директива.В противном случае попробуйте использовать некоторую форму escape-последовательности, чтобы избежать вставки буквенного символа в ваш исходный код.Я ничего не знаю о PHP, поэтому ничего не могу с этим поделать.
Редактировать
Я читаю, что PHP не поддерживает Unicode.Таким образом, ввод Unicode, который вы передаете, скорее всего рассматривается как строка байтов, в которой Unicode был закодирован как.
Если вы можете быть уверены, что ваш ввод поступает как utf-8, тогда вы можете сопоставитьUTF-8 последовательность для ı
, которая \xc4 \xb1
, как в:
$str = 'mısır'; # Make sure this source-file is encoded as utf-8 or this match will fail
echo (preg_match('!m(i|\xc4\xb1)s(i|\xc4\xb1)r!', $str)) ? "ok\n" : "fail\n";
Это работает?
Изменить еще раз:
Я могу объяснитьпочему ваши первые три теста проходят.Давайте представим, что в вашей кодировке ı
кодируется как ABCDE
.тогда PHP видит следующее:
echo 'match single normal i: ';
$str = 'mi';
echo (preg_match('!m[ABCDEi]!', $str)) ? "ok\n" : "fail\n";
echo 'match single undotted ABCDE: ';
$str = 'mABCDE';
echo (preg_match('!m[ABCDEi]!', $str)) ? "ok\n" : "fail\n";
echo 'match double normal i: ';
$str = 'misir';
echo (preg_match('!m[ABCDEi]s[ABCDEi]r!', $str)) ? "ok\n" : "fail\n";
echo 'match double undotted ABCDE: ';
$str = 'mABCDEsABCDEr';
echo (preg_match('!m[ABCDEi]s[ABCDEi]r!', $str)) ? "ok\n" : "fail\n";
, что делает очевидным, почему первые три теста проходят, а последний не проходит.Если вы используете начальный / конечный якорь ^...$
, я думаю, вы обнаружите, что только первый тест пройден.