Как я могу догадаться, если строка содержит текст или двоичные данные в Perl? - PullRequest
2 голосов
/ 12 января 2010

Как лучше всего определить, является ли скалярное значение ASCII / UTF8 (текст) или двоичными данными в Perl? Правильно ли этот код?:

if (is_utf8($scalar, 1) or ($scalar =~ m/\A [[:ascii:]]* \Z/xms)) {
     # $scalar is a text
}
else {
     # $scalar is a binary
}

Есть ли лучший способ?

Ответы [ 2 ]

4 голосов
/ 12 января 2010

is_utf8 проверяет, включен флаг Perl utf8 или нет. Скаляр может содержать правильно сформированный utf-8 и не иметь включенного флага. Я думаю, что возможно сознательно включить флаг даже с искаженным utf-8, но я не уверен.

Чтобы проверить, содержит ли скаляр данные UTF-8, необходимо проверить флаг, а если нет, также попробовать что-то вроде

eval {
    my $utf8 = decode_utf8 ($scalar);
}

, а затем проверьте наличие ошибок в $@.

Чтобы проверить, содержит ли скаляр не UTF-8 данные не ASCII, ваша идея $scalar =~ m/\A [[:ascii:]]* \Z/xms выглядит хорошо.

2 голосов
/ 12 января 2010

Очевидно, что лучший способ - просто отслеживать, когда вы читаете данные. Вы, как программист, уже должны знать, получаете ли вы текст (и его кодировку) или двоичные данные. Когда вы читаете текст, вы Encode::decode() его (см. http://p3rl.org/UNI) в текстовые строки Perl.

Если вы действительно не знаете заранее, тесты файлов -T и -B предлагают эвристику.

Не обращая внимания на ответ Кинопико, в подавляющем большинстве случаев вам не нужно знать о внутреннем представлении данных, а неправильное использование служебных функций из прагматического модуля utf8 - неправильный подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...