Я — эксперт в области разработки веб-приложений и безопасности в интернете. Каждый месяц мой блог посещают около 90 тысяч человек. Работаю техническим директором в «Системах документооборота», занимаюсь электронным правительством.
sub detect_utf8($) {
my $str = shift;
my %exclude = map { $_ => undef } (0..191, 194..244); # RFC 3629
for (my $i = 0, $l, $len = length $str; $i < $len; $i++) {
$code = ord substr($str, $i, 1);
return 0 unless exists $exclude{$code};
for ($l = 0; $code & 128; $l++, $code = 0xFF & ($code << 1)) {}
$i += $l - 1 if $l;
return 0 if $i > $len or $l > 4; # broken
}
1;
}
Что можно улучшить: проверять, чтобы дополнительные байты имели старшие биты «10».
david-m.livejournal.com (david-m.livejournal.com)
15 апреля 2009, 00:20
bolk (bolknote.ru)
15 апреля 2009, 09:36,
ответ предназначен david-m.livejournal.com:
david-m.livejournal.com (david-m.livejournal.com)
15 апреля 2009, 15:52
bolk (bolknote.ru)
15 апреля 2009, 17:55,
ответ предназначен david-m.livejournal.com:
david-m.livejournal.com (david-m.livejournal.com)
В принципе, это одним регекспом делается. Искать, правда, отчаянно лень, в последний раз эта задача передо мной вставала лет пять назад:)15 апреля 2009, 00:03