Решено.
Как отмечалось в комментариях, проблема заключалась в том, что я неправильно обращался к ViewController.
Чтобы получить доступ к моему ViewController вне класса ViewController, я создал его новый экземпляр с помощью ViewController()
.
Я решил это, поместив функцию внутри класса и изменив часть ViewController()
на self.ViewController
.
Этот ответ также помог мне. https://stackoverflow.com/a/45932084/7414387
echo あ| perl -nle 'BEGIN{binmode STDIN,":utf8"} print"[$_]"; print /[[:print:]]/ ? "YES" : "NO"'
Это главным образом работает, хотя это генерирует предупреждение о широком символе. Но это дает Вам идею: необходимо быть уверены, что Вы имеете дело с реальной строкой unicode (проверьте utf8:: is_utf8). Или просто проверьте perlunicode вообще - целый предмет все еще заставляет мою голову кружиться.
Я думаю, что Вы не хотите или нуждаетесь в локалях для этого, но, а скорее Unicode. Если Вы декодировали текстовую строку, \w
будет соответствовать словесным символам на любом языке, \d
соответствия не просто 0..9
но каждая цифра Unicode и т.д. В regexes можно запросить свойства Unicode с \p{PropertyName}
. Особенно интересный для Вас мог бы быть \p{Print}
. Вот список всех доступных свойств символа Unicode.
Я написал статью об основах и тонкости Unicode и Perl, он должен дать Вам хорошую идею о том, что сделать, тот жемчуг распознает Вашу строку как последовательность символов, не только последовательность байтов.
Обновление: с Unicode Вы не получаете языковозависимое поведение, но вместо этого нормальные значения по умолчанию независимо от языка. Это может или не может быть тем, что Вы хотите, но для различия priintable/control символа я не вижу, почему Вам было бы нужно языковозависимое поведение.
Вы могли всегда использовать класс символов [^[:cntrl:]]
соответствовать неуправляющим символам.
\X
соответствует полностью составленному символу (последовательности). Доказательство:
#!/usr/bin/env perl
use 5.010;
use utf8;
use Encode qw(encode_utf8);
for my $string (qw(あ ご ご), "\x{3099}") {
say encode_utf8 sprintf "%s $string", $string =~ /\A \X \z/msx ? 'ok' : 'nok';
}
Тестовыми данными являются: нормальный символ, предкомбинированный символ, комбинированная символьная последовательность и комбинированный символ (что само по себе "не считается", упрощение Главы 3 Юникода).
Замените \X
на [[:print:]]
, чтобы увидеть, что ответ Танктала приводит к ложным совпадениям для двух последних случаев.