Я использующий utf8:: is_utf8 правильно?

Это работает правильно? Некоторые сообщения об ошибках, уже расшифровывают, и некоторая потребность действительно расшифрован, действительно получают правильную продукцию.

#!/usr/bin/env perl
use warnings;
use strict;
use utf8;
use open qw(:utf8 :std);
use Encode qw(decode_utf8);

# ...

if ( not eval{
    # some error-messages (utf8) are decoded some are not
    1 }
) {
    if ( utf8::is_utf8 [email protected] ) {
        print [email protected];
    }
    else {
        print decode_utf8( [email protected] );
    }
}
1
nl ja de
Сообщения выходят правильные? Если да, это, вероятно, работает.
добавлено автор choroba, источник

1 ответы

Я использующий utf8:: is_utf8 правильно?

Нет. Любое использование utf8:: is_utf8 неправильный, поскольку вы никогда не должны использовать его! Используя utf8:: is_utf8 , чтобы предположить семантику последовательности - то, что известно как случай Ошибка Unicode. За исключением осмотра внутреннего состояния переменных, отлаживая модуль Perl или XS, utf8:: у is_utf8 есть быть бесполезное.

It does not indicate whether the value in a variable is encoded using UTF-8 or not. In fact, that's impossible to know reliably. For example, does "\xC3\xA9" produce a string that's encoded using UTF-8 or not? Well, there's no way to know! It depends on whether I meant "é", "é" or something entirely different.

Если переменная может содержать и закодированные и расшифрованные последовательности, Вам решать чтобы отследить то использование второй переменной. Я категорически не рекомендую это, все же. Просто расшифруйте все, поскольку это входит с внешней стороны.

Если вы действительно не можете, ваш лучший выбор, он, чтобы попытаться расшифровать $ и игнорирует ошибки. Это очень вряд ли то, что что-то удобочитаемое, которое не является UTF-8, было бы действительным UTF-8.

# [email protected] is sometimes encoded. If it's not,
# the following will leave it unchanged.
utf8::decode([email protected]);

print [email protected];
7
добавлено
@ikegami Ваши тесты просто неправильные, просто печатают результат is_utf8 непосредственно после inet_aton , и вы будете видеть, что результат - 0 , потому что у вас есть массив байтов. Прохождение этого, чтобы кодирует неправильный, потому что это только работает над символьными строками. Прохождение снова, чтобы расшифровывает неправильный также, потому что вы don' у t есть закодированный массив байтов UTF-8, но что-то отличающееся произвольное. расшифровывает только doesn' t терпят неудачу, но проблема - вы делающий неправильные предположения, не флаг. Мусор в, мусор. Ваши 2. пример имеет дело с массивом байтов также, таким образом 0 ожидается продукция, независимо от Unicode.
добавлено автор Thorsten Schöning, источник
@ikegami Perl' s доктора не не соглашаются со мной, они ясно различают массивы байтов и символьные строки и под которыми обстоятельствами флаг UTF-8 один или прочь и которые вводят, ожидается. Просто прочитайте докторов сами: кодирует : "Флаг UTF8 выключен".; снижение : "Может использоваться, чтобы удостовериться, что флаг UTF-8 выключен, например, когда вы хотите удостовериться, что substr() или длина() функционируют работы с обычно более быстрым алгоритмом байта".
добавлено автор Thorsten Schöning, источник
длина couldn' t использоваться, чтобы посчитать количество знаков в символьной строке против числа байтов (!) в той же самой последовательности в произвольном различном кодировании тогда, но тот пример даже упоминается в докторах для длины: "Как все операции по характеру Perl, длина обычно имеет дело с логическими знаками, не физическими байтами. Поскольку, сколько, подняли бы байты последовательность, закодированная как UTF-8, используйте длину (Закодируйте:: закодируйте (' UTF 8\U 0026\\U 0023\39; EXPR))", Пожалуйста, объясните что пример без Perl, отличающего символьные строки и массивы байтов. Конечно, пользователь должен был бы кодировать/расшифровывать правильно прежде.
добавлено автор Thorsten Schöning, источник
@sid_com, Добавленный к моему ответу.
добавлено автор ikegami, источник
@rjh, нет, вам просто нужно utf8:: модернизация или utf8:: снижение .
добавлено автор ikegami, источник
@Thorsten Schö ning. Ре" Так да, флаг ДЕЙСТВИТЕЛЬНО отличает точно это. ", проход вы указали doesn' t противоречат тому, что я сказал вообще. Доктора говорят о том, как последовательность сохранена внутренне, который не важен здесь. Мой ответ только говорит о ценности переменной , не как it' s сохраненный внутренне.
добавлено автор ikegami, источник
@Thorsten Schö ning, That' s не, как Перл работает. Точно так же, как Перл полагает, что ноль ноль, сохраненный ли как IV, UV, NV, ОБЪЕМ ПЛАЗМЫ [UTF8=0] или ОБЪЕМ ПЛАЗМЫ [UTF8=1], Перл doesn' t различают последовательность, сохраненную, используя ОБЪЕМ ПЛАЗМЫ [UTF8=0] или ОБЪЕМ ПЛАЗМЫ [UTF8=1]. is_utf8 ничего не говорит о последовательности кроме как it' s сохраненный. Можно проверить это при помощи печать или eq на продукции inet_aton прежде и после того, как кодировать - расшифрует. $ _ все еще содержит те же самые байты. Как стоимость сохранена doesn' t затрагивают стоимость.
добавлено автор ikegami, источник
Используя utf8:: is_utf8 , чтобы предположить семантику является what' s известный как случай Ошибка Unicode. Когда оба жемчуг ( печать , eq , порядок , длина , sprintf "%vX" , и т.д.) и документация Perl не соглашается с вами, необходимо понять намек и прекратить распространять эту дезинформацию!
добавлено автор ikegami, источник
Ре" Ваши 2. пример имеет дело с массивом байтов также, таким образом, 0 ожидается продукция, независимо от Unicode ", нет, it' s множество Кодовых точек Unicode. C9 - Кодовая точка Unicode для "É"; не его кодирование UTF-8. OP определенно спросил, является ли is_utf8 правильным способом проверить, расшифровано ли что-то уже или нет, который это ясно показывает иначе. Прохождение последовательности в моем примере, чтобы расшифровывает был бы неправильным потому что it' s уже расшифрованный.
добавлено автор ikegami, источник
Ре" Perl' s доктора не не соглашаются со мной ", Снова, они называют то, что вы способствуете "Ошибке Unicode", и разработчики Perl и модулей активно удаляли код, страдающий от этой ошибки. Ре///" , который они ясно отличают между массивами байтов и символьными строками ", О, я знаю, есть два формата хранения. There' s несомненно об этом. То, что я сказал, то, что вы can' t подразумевают значение о ценности последовательности на основе формата хранения (т.е. на основе флага UTF8).
добавлено автор ikegami, источник
Ре" снижение: "Может использоваться, чтобы удостовериться, что флаг UTF-8 выключен, например, когда вы хотите удостовериться, что substr() или длина() функционируют работы с обычно более быстрым алгоритмом байта. "", Это на самом деле поддерживает мой пункт, и противоречит вашему. Как я сказал, изменив формат хранения doesn' t меняют струну, и это - причина, можно модернизировать и понизить переменную так, как вы хотите. Вы can' t подразумевают значение о ценности последовательности на основе формата хранения (т.е. на основе флага UTF8).
добавлено автор ikegami, источник
Я соглашаюсь, за исключением того, что utf8:: is_utf8 может быть полезен для работы вокруг Ошибки Unicode на более старом Perls. Печально у нас все еще есть 5.8.8 машин в производстве...
добавлено автор rjh, источник
Modern::Perl
Modern::Perl
362 участник(ов)

Пожалуйста, представьтесь при добавлении в группу. Это необходимо во избежание спам-ботов. Ваше первое сообщение не должно быть ссылкой или репостом. Мы всегда рады нестандартным вопросам.

use Perl or die;
use Perl or die;
164 участник(ов)

Группа о языке Perl и обо всём что с ним связано.

pro.perl
pro.perl
22 участник(ов)

Язык программирования Perl