Почему мои тесты на Perl терпят неудачу с `use encoding ‘utf8’`?

Я озадачен этим тестовым скриптом:

#!perl use strict; use warnings; use encoding 'utf8'; use Test::More 'no_plan'; ok('áá' =~ m/á/, 'ok direct match'); my $re = qr{á}; ok('áá' =~ m/$re/, 'ok qr-based match'); like('áá', $re, 'like qr-based match'); 

Три теста терпят неудачу, но я ожидал, что use encoding 'utf8' будет обновлять как литералы, áá и áá -основанные áá до строк utf8 и, таким образом, проходить тесты.

Если я удалю строку use encoding использования, тесты пройдут так, как ожидалось, но я не могу понять, почему они потерпят неудачу в режиме utf8 .

Я использую perl 5.8.8 в Mac OS X (версия системы).

Не используйте прагму encoding . Оно сломано. (Juerd Waalboer дал отличный разговор, где он упомянул об этом в YAPC :: EU 2k8.)

Он делает по крайней мере две вещи одновременно, которые не принадлежат друг другу:

  1. Он определяет кодировку для исходного файла.
  2. Он определяет кодировку для ввода / вывода вашего файла.

И для добавления травмы к оскорблению он также делает № 1 сломанным способом: он переинтерпретирует последовательности \xNN как незакодированные октеты, а не рассматривает их как кодовые точки и декодирует их, не позволяя вам выражать символы вне указанной вами кодировки и создание вашего исходного кода означает разные вещи в зависимости от кодировки. Это просто поразительно неправильно.

Напишите исходный код только в ASCII или UTF-8. В последнем случае прагма utf8 – правильная вещь для использования. Если вы не хотите использовать UTF-8, но вы хотите включить не-ASCII-charcters, выйдите или расшифруйте их явно.

И используйте уровни ввода / вывода в явном виде или установите их с помощью open прагмы, чтобы правильно перекодировать I / O.

Он отлично работает на моем компьютере (на perl 5.10). Возможно, вам стоит попробовать заменить эту use encoding 'utf8' use utf8 .

Какую версию Perl вы используете? Я думаю, что у старых версий были ошибки с UTF-8 в регулярных выражениях.

Документация Test :: More содержит исправление для этой проблемы, которое я только что нашел сегодня (и эта запись выше в googles).

utf8 / “Широкий символ в печати”

Если вы используете utf8 или другие символы, отличные от ASCII, с помощью Test :: More, вы можете получить предупреждение «Широкий символ в печати». Используя binmode STDOUT, «: utf8» не будет исправлять это. Test :: Builder (с полномочиями Test :: More) дублирует STDOUT и STDERR. Поэтому любые изменения в них, в том числе изменение их выходных дисциплин, не будут казаться Test :: More. Работа заключается в том, чтобы напрямую изменить дескрипторы файлов, используемые Test :: Builder.

 my $builder = Test::More->builder; binmode $builder->output, ":utf8"; binmode $builder->failure_output, ":utf8"; binmode $builder->todo_output, ":utf8"; 

Я добавил этот бит шаблона к моему тестовому коду, и он работает в обаянии.

  • Как проверить производительность приложения для Android?
  • Как смоделировать среду с низкой пропускной способностью и высокой задержкой?
  • Как spec / rails_helper.rb отличается от spec / spec_helper.rb? Нужно ли мне это?
  • как реализовать тесты приложений в xcode4?
  • Как определить и переключиться на кадр в веб-seleniumе, когда кадр не имеет идентификатора
  • Как решить ошибку LNK2019: нерешенный внешний символ - функция?
  • WebDriver: проверьте, существует ли элемент?
  • Selenium: Можно ли установить любое значение атрибута WebElement в Selenium?
  • Запуск приложения до и после Suite в jUnit 4.x
  • Как разработать и протестировать приложение, отправляющее электронные письма (без заполнения чей-то почтового ящика с тестовыми данными)?
  • Почему я должен практиковать Test Driven Development и как мне начать?
  • Давайте будем гением компьютера.