perl - текста - почему utf 8




Почему современный Perl избегает UTF-8 по умолчанию? (5)

Интересно, почему большинство современных решений, построенных с использованием Perl, не позволяют UTF-8 по умолчанию.

Я понимаю, что для основных сценариев Perl существует много унаследованных проблем, где это может нарушить ситуацию. Но, с моей точки зрения, в 21 веке большие новые проекты (или проекты с большой перспективой) должны сделать свое программное обеспечение UTF-8 доказательством с нуля. Тем не менее я этого не вижу. Например, Moose допускает строгие предупреждения и предупреждения, но не Unicode . Modern::Perl уменьшает шаблон, но без обработки UTF-8.

Зачем? Есть ли некоторые причины, чтобы избежать UTF-8 в современных проектах Perl в 2011 году?

Комментарий @tchrist слишком длинный, поэтому я добавляю его здесь.

Кажется, я не прояснился. Позвольте мне попытаться добавить некоторые вещи.

tchrist и я вижу ситуацию довольно аналогично, но наши выводы полностью противоположны. Я согласен, ситуация с Unicode сложна, но именно поэтому мы (пользователи и кодеры Perl) нуждаемся в некотором слое (или прагме), что делает обработку UTF-8 такой же простой, как и сейчас.

tchrist указал на многие аспекты, чтобы покрыть, я буду читать и думать о них в течение нескольких дней или даже недель. Тем не менее, это не моя точка зрения. tchrist пытается доказать, что нет единого способа «включить UTF-8». У меня не так много знаний, чтобы спорить с этим. Итак, я придерживаюсь живых примеров.

Я играл с Rakudo и UTF-8 был там, где мне было нужно . У меня не было никаких проблем, это просто сработало. Может быть, есть какое-то ограничение где-то глубже, но на старте все, что я тестировал, работало так, как я ожидал.

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

Другой пример, но с более негативным тоном. Рамки должны облегчить процесс разработки. Несколько лет назад я пробовал веб-фреймворки, но просто выбросил их, потому что «включение UTF-8» было настолько неясным. Я не нашел, как и где подключить поддержку Unicode. Это было так много времени, что мне стало легче идти по-старому. Теперь я увидел здесь щедрость, чтобы справиться с той же проблемой с Mason 2: Как сделать Mason2 UTF-8 чистым? , Таким образом, это довольно новая структура, но использование ее с UTF-8 требует глубокого знания ее внутренних компонентов. Это как большой красный знак: СТОП, не используйте меня!

Мне очень нравится Perl. Но работать с Юникодом - больно. Я все еще сталкиваюсь с стенами. Некоторый путь tchrist прав и отвечает на мои вопросы: новые проекты не привлекают UTF-8, потому что это слишком сложно в Perl 5.


🌴 🐪🐫🐪🐫🐪 🌞 𝕲𝖔 𝕿𝖍𝖔𝖚 𝖆𝖓𝖉 𝕯𝖔 𝕷𝖎𝖐𝖊𝖜𝖎𝖘𝖊 🌞 🐪🐫🐪 🐁

𝓔𝓭𝓲𝓽: 𝙎𝙞𝙢𝙥𝙡𝙚𝙨𝙩 : 𝟕 𝘿𝙞𝙨𝙘𝙧𝙚𝙩𝙚 𝙍𝙚𝙘𝙤𝙢𝙢𝙚𝙣𝙙𝙖𝙩𝙞𝙤𝙣𝙨

  1. Установите PERL_UNICODE переменную AS . Это заставляет все скрипты Perl декодировать @ARGV как строки UTF-8 и устанавливает кодировку всех трех stdin, stdout и stderr в UTF-8. Оба они являются глобальными эффектами, а не лексическими.

  2. В верхней части исходного файла (программа, модуль, библиотека, do hickey), явным образом утверждают, что вы используете версию perl версии 5.12 или выше:

    use v5.12; # minimal for unicode string feature

    use v5.14; # optimal for unicode string feature

  3. Включить предупреждения, поскольку в предыдущем объявлении разрешены только стриктуры и функции, а не предупреждения. Я также предлагаю продвигать предупреждения Unicode на исключения, поэтому используйте обе эти строки, а не только одну из них. Обратите внимание, однако, что в соответствии с v5.14 класс предупреждения utf8 содержит три других субмашины, которые могут быть включены отдельно: nonchar , surrogate и non_unicode . Возможно, вы захотите усилить контроль над ними.

    use warnings;

    use warnings qw( FATAL utf8 );

  4. Объявите, что этот исходный блок закодирован как UTF-8. Хотя когда-то эта прагма делала другие вещи, теперь она служит единственной единственной цели, а не другой:

    use utf8;

  5. Объявите, что все, что открывает дескрипторы файлов в этой лексической области, но не в другом месте, заключается в том, чтобы предположить, что этот поток закодирован в UTF-8, если вы не сообщите об этом иначе. Таким образом, вы не будете влиять на код другого модуля или другой программы.

    use open qw( :encoding(UTF-8) :std );

  6. Включить именованные символы через \N{CHARNAME} .

    use charnames qw( :full :short );

  7. Если у вас есть дескриптор DATA , вы должны явно указать его кодировку. Если вы хотите, чтобы это было UTF-8, скажите:

    binmode(DATA, ":encoding(UTF-8)");

Конечно, нет конца другим вопросам, с которыми в конечном итоге вы можете столкнуться, но этого достаточно, чтобы приблизиться к государственной цели: «заставить все работать с UTF-8», хотя и в несколько ослабленном смысле этих терминов.

Еще одна прагма, хотя это не относится к Unicode:

      use autodie;

Настоятельно рекомендуется.

🎅 𝕹 𝖔 𝕸 𝖆 𝖌 𝖎 𝖈 𝕭 𝖚 𝖑 𝖑 𝖊 𝖙 🎅

Говоря, что «Перл должен [ как-то! ] включить Unicode по умолчанию "даже не начинает задумываться о том, чтобы обойтись, чтобы сказать достаточно, чтобы быть даже незначительно полезным в каком-то редком и изолированном случае. Unicode намного больше, чем просто более крупный репертуар персонажей; это также то, как эти персонажи взаимодействуют многими, разными способами.

Даже скромные минимальные меры, которые (некоторые) люди, по-видимому, думают, что они хотят, гарантируют, что удручающе прорвутся миллионы строк кода, код, который не имеет шансов «обновиться» до вашей новой новой храброй новой мировой современности.

Это путь намного сложнее, чем люди притворяются. За последние несколько лет я много думал об этом. Мне хотелось бы показать, что я ошибаюсь. Но я не думаю, что это так. Unicode существенно сложнее, чем модель, которую вы хотели бы наложить на нее, и здесь есть сложность, что вы никогда не сможете подметать под ковром. Если вы попробуете, вы сломаете либо свой собственный код, либо чужой. В какой-то момент вам просто нужно сломаться и узнать, что такое Unicode. Вы не можете притворяться, что это не так.

🐪 выходит из своего пути, чтобы сделать Unicode легким, гораздо больше, чем что-либо еще, что я когда-либо использовал. Если вы считаете, что это плохо, попробуйте что-нибудь еще какое-то время. Затем вернитесь к 🐪: либо вы вернетесь в лучший мир, либо вы принесете вместе с вами знание об этом, чтобы мы могли использовать ваши новые знания, чтобы сделать это лучше.

💡 𝕴𝖉𝖊𝖆𝖘 𝖋𝖔𝖗 𝖆 𝖀𝖓𝖎𝖈𝖔𝖉𝖊 ⸗ 𝕬𝖜𝖆𝖗𝖊 🐪 𝕷𝖆𝖚𝖓𝖉𝖗𝖞 𝕷𝖎𝖘𝖙 💡

Как минимум, вот некоторые вещи, которые, по-видимому, потребуются для того, чтобы «включить Unicode по умолчанию», как вы выразились:

  1. Все исходные коды должны быть в UTF-8 по умолчанию. Вы можете получить это с use utf8 или export PERL5OPTS=-Mutf8 .

  2. Ручкой 🐪 DATA должен быть UTF-8. Вам нужно будет сделать это на основе пакета, как в binmode(DATA, ":encoding(UTF-8)") .

  3. По умолчанию для аргументов программы для 🐪 скриптов следует понимать UTF-8. export PERL_UNICODE=A или perl -CA или export PERL5OPTS=-CA .

  4. Стандартные потоки ввода, вывода и ошибок должны использоваться по умолчанию для UTF-8. export PERL_UNICODE=S для всех из них, или I , O и / или E для некоторых из них. Это похоже на perl -CS .

  5. Любые другие ручки, открытые 🐪, должны рассматриваться как UTF-8, если не указано иное; export PERL_UNICODE=D или с i и o для некоторых из них; export PERL5OPTS=-CD будет работать. Это делает -CSAD для всех.

  6. Покройте обе базы плюс все потоки, которые вы открываете с export PERL5OPTS=-Mopen=:utf8,:std . См. uniquote .

  7. Вы не хотите пропустить ошибки кодирования UTF-8. Попробуйте export PERL5OPTS=-Mwarnings=FATAL,utf8 . И убедитесь, что ваши входные потоки всегда binmode d :encoding(UTF-8) , а не только :utf8 .

  8. Кодовые точки между 128-255 должны быть поняты 🐪 как соответствующие кодовые точки Юникода, а не только непроизведенные двоичные значения. use feature "unicode_strings" или export PERL5OPTS=-Mfeature=unicode_strings . Это сделает uc("\xDF") eq "SS" и "\xE9" =~ /\w/ . Простой export PERL5OPTS=-Mv5.12 или выше также получит это.

  9. Именованные символы Unicode по умолчанию не включены, поэтому добавьте export PERL5OPTS=-Mcharnames=:full,:short,latin,greek или некоторые из таких. См. uninames и tcgrep .

  10. Вам почти всегда нужен доступ к функциям из стандартного Unicode::Normalize модуля различных типов разложений. export PERL5OPTS=-MUnicode::Normalize=NFD,NFKD,NFC,NFKD , а затем всегда запускать входящие данные через NFD и исходящие данные из NFC. Для них еще нет уровня ввода-вывода, но я знаю, но вижу nfd , nfkd , nfkc и nfkc .

  11. Сравнение строк в 🐪 с использованием eq , ne , lc , cmp , sort , & c & cc всегда неверно. Поэтому вместо @a = sort @b вам нужно @a = Unicode::Collate->new->sort(@b) . Мог бы также добавить это к вашему export PERL5OPTS=-MUnicode::Collate . Вы можете кэшировать ключ для двоичных сравнений.

  12. 🐪 встроенные printf такие как printf и write делают неправильные данные с данными Unicode. Вам нужно использовать модуль Unicode::GCString для первого и оба, а также модуль Unicode::LineBreak а также для последнего. См. uwc и unifmt .

  13. Если вы хотите, чтобы они считались целыми числами, вам придется запускать захват \d+ через функцию Unicode::UCD::num потому что встроенный atoi (3) is в настоящее время не достаточно умен.

  14. У вас возникнут проблемы с файловой системой в 👽 файловых системах. Некоторые файловые системы молча применяют преобразование в NFC; другие молчат принудительное преобразование в НФД. И другие делают что-то еще. Некоторые даже вообще игнорируют этот вопрос, что приводит к еще большим проблемам. Таким образом, вы должны выполнять свою обработку NFC / NFD, чтобы поддерживать работоспособность.

  15. Весь ваш 🐪-код, содержащий az или AZ и такие ДОЛЖНЫ БЫТЬ ИЗМЕНЕНЫ , включая m// , s/// и tr/// . Это должно выделяться как кричащий красный флаг, что ваш код сломан. Но неясно, как это должно измениться. Получение правильных свойств и понимание их случайных дел сложнее, чем вы думаете. Я использую unichars и uniprops каждый день.

  16. Код, который использует \p{Lu} , почти так же ошибочен, как и код, который использует [A-Za-z] . Вам нужно использовать \p{Upper} вместо этого и знать причину. Да, \p{Lowercase} \p{Lower} \p{Lowercase} и \p{Lower} отличаются от \p{Ll} и \p{Lowercase_Letter} \p{Lower} \p{Lowercase_Letter} .

  17. Код, который использует [a-zA-Z] , еще хуже. И он не может использовать \pL или \p{Letter} ; он должен использовать \p{Alphabetic} . Не все алфавиты - это буквы, вы знаете!

  18. Если вы ищете переменные 🐪 с /[\$\@\%]\w+/ , то у вас есть проблема. Вам нужно искать /[\$\@\%]\p{IDS}\p{IDC}*/ и даже не думать о переменных препинания или переменных пакета.

  19. Если вы проверяете пробелы, вы должны выбрать между \h и \v , в зависимости. И вы никогда не должны использовать \s , так как он НЕ ЗНАЕТ [\h\v] , вопреки распространенному мнению.

  20. Если вы используете \n для границы строки или даже \r\n , то вы делаете это неправильно. Вы должны использовать \R , что не то же самое!

  21. Если вы не знаете, когда и нужно ли вызывать Unicode::Stringprep , тогда вам лучше учиться.

  22. Нечувствительные к регистру сравнения должны проверять, являются ли две вещи одинаковыми буквами независимо от их диакритики и т. Д. Самый простой способ сделать это - стандартный модуль Unicode :: Collate . Unicode::Collate->new(level => 1)->cmp($a, $b) . Существуют также eq методы и т. Д., И вам, вероятно, следует узнать о методах match и substr . Они имеют определенные преимущества перед встроенными модулями.

  23. Иногда этого еще недостаточно, и вам нужен модуль Unicode::Collate::Locale->new(locale => "de__phonebook", level => 1)->cmp($a, $b) :: Locale , как в Unicode::Collate::Locale->new(locale => "de__phonebook", level => 1)->cmp($a, $b) . Учтите, что Unicode::Collate::->new(level => 1)->eq("d", "ð") истинно, но Unicode::Collate::Locale->new(locale=>"is",level => 1)->eq("d", " ð") ложно. Аналогичным образом, «ae» и «æ» являются eq если вы не используете локали или используете английский, но они отличаются в исландском языке. Что теперь? Это сложно, говорю вам. Вы можете играть с unifmt чтобы проверить некоторые из этих вещей.

  24. Рассмотрим, как совместить шаблон CVCV (согласный, гласный, согласный, гласный) в строке « niño ». Его форма NFD, которую вы чертовски лучше, вспомнила, чтобы положить ее - становится «nin \ x {303} o». Теперь, что ты собираешься делать? Даже притворяясь, что гласная [aeiou] (кстати, это неверно), вы не сможете сделать что-то вроде (?=[aeiou])\X) , потому что даже в NFD кодовая точка типа ' ø ' не разлагается ! Тем не менее, он будет испытывать равным «o», используя сравнение UCA, которое я вам только что показал. Вы не можете полагаться на NFD, вы должны полагаться на UCA.

💩 𝔸 𝕤 𝕤 𝕦 𝕞 𝕖 𝔹 𝕣 𝕠 𝕜 𝕖 𝕟 𝕟 𝕟 𝕖 𝕤 💩

И это еще не все. Есть миллионы ошибочных предположений, которые люди делают о Unicode. Пока они не поймут эти вещи, их код будет нарушен.

  1. Код, который предполагает, что он может открыть текстовый файл, не указав, что кодировка нарушена.

  2. Код, который предполагает кодировку по умолчанию, является некоей родной кодировкой платформы.

  3. Код, предполагающий, что веб-страницы на японском или китайском языке занимают меньше места в UTF-16, чем в UTF-8, неверны.

  4. Код, предполагающий, что Perl использует UTF-8 внутренне неправильно.

  5. Кодекс, предполагающий, что ошибки кодирования всегда вызывает исключение, неверно.

  6. Код, который предполагает, что точки кода Perl ограничены 0x10_FFFF, неверен.

  7. Код, предполагающий, что вы можете установить $/ на то, что будет работать с любым допустимым разделителем строк, неверно.

  8. Код, который предполагает равенство округления в casefolding, например lc(uc($s)) eq $s или uc(lc($s)) eq $s , полностью нарушается и ошибочно. Предположим, что uc("σ") и uc("ς") являются "Σ" , но lc("Σ") не может возвращать оба из них.

  9. Код, предполагающий, что каждая строка в нижнем регистре имеет отдельный верхний регистр или наоборот. Например, "ª" - это строчная буква без прописных букв; тогда как "ᵃ" и "ᴬ" являются буквами, но они не являются строчными буквами; однако они оба являются строчными кодовыми точками без соответствующих версий в верхнем регистре. Понял? Они не \p{Lowercase_Letter} , несмотря на то, что они оба - \p{Letter} и \p{Lowercase} .

  10. Код, предполагающий изменение случая, не меняет длину строки.

  11. Код, предполагающий наличие только двух случаев. Там также есть заголовок.

  12. Код, который предполагает, что только буквы имеют случай, нарушается. Оказывается, что за пределами букв цифры, символы и четные знаки имеют дело. Фактически, изменение дела может даже заставить что-то изменить свою основную общую категорию, например, \p{Mark} превратиться в \p{Letter} . Он также может заставить его переключиться с одного сценария на другой.

  13. Код, предполагающий, что случай никогда не зависит от локали, нарушается.

  14. Код, который предполагает, что Unicode показывает, что локали POSIX нарушены.

  15. Код, который предполагает, что вы можете удалить диакритические знаки, чтобы получить на них буквы ASCII, является злым, все еще сломанным, поврежденным мозгом, неправильным и оправданием смертной казни.

  16. Код, предполагающий, что диакритики \p{Diacritic} и знаки \p{Mark} - одно и то же, нарушается.

  17. Код, который предполагает \p{GC=Dash_Punctuation} охватывает столько же, сколько \p{Dash} .

  18. Код, который предполагает, что тире, дефисы и минусы - это одно и то же, что и друг у друга, или что есть только один из них, сломан и ошибочен.

  19. Код, предполагающий, что каждая точка кода занимает не более одного столбца печати, нарушена.

  20. Код, предполагающий, что все символы \p{Mark} занимают нулевые столбцы печати, разбиты.

  21. Код, который предполагает, что персонажи, которые похожи друг на друга, нарушены.

  22. Код, предполагающий, что символы, которые не похожи друг на друга, не похожи друг на друга, нарушается.

  23. Код, который предполагает, что существует ограничение на количество кодовых точек в строке, которые могут совпадать только с одним \X

  24. Код, предполагающий, что \X никогда не может начинаться с символа \p{Mark} неверен.

  25. Код, предполагающий, что \X никогда не может содержать два символа non \p{Mark} .

  26. Код, предполагающий, что он не может использовать "\x{FFFF}" , неверен.

  27. Код, который предполагает кодовую точку, отличную от BMP, которая требует, чтобы два блока кода UTF-16 (суррогатные) кодировали два отдельных символа UTF-8, по одному на единицу кода, ошибочны. Это не так: он кодирует единую кодовую точку.

  28. Код, который перекодирует из UTF-16 или UTF-32 с ведущими спецификациями в UTF-8, разбивается, если он помещает спецификацию в начале результирующего UTF-8. Это настолько глупо, что у инженера должны быть сняты веки.

  29. Код, предполагающий, что CESU-8 является допустимой кодировкой UTF, неверен. Аналогично, код, который считает кодировку U + 0000 как "\xC0\x80" является UTF-8, и он ошибочен. Эти парни также заслуживают лечения век.

  30. Код, который предполагает, что символы типа > всегда указывают на правое и < всегда указывает на левые, неверны, потому что они на самом деле этого не делают.

  31. Код, который предполагает, что если вы сначала выведете символ X а затем символ Y , то они появятся как XY . Иногда они этого не делают.

  32. Код, предполагающий, что ASCII достаточно хорош для правильного написания английского, является глупым, близоруким, неграмотным, сломанным, злым и неправильным. С головы! Если это кажется слишком экстремальным, мы можем пойти на компромисс: отныне они могут печатать только с большим пальцем ноги с одной ноги (остальное все еще уклоняется).

  33. Код, предполагающий, что все кодовые точки \p{Math} являются видимыми символами, неверны.

  34. Код, предполагающий \w содержит только буквы, цифры и символы подчеркивания.

  35. Код, предполагающий, что символы ^ и ~ являются пунктуационными знаками, неверны.

  36. Код, предполагающий, что ü имеет умлаут, неверен.

  37. Код, который считает, что такие вещи, как содержат любые буквы в них, неверны.

  38. Код, который считает, что \p{InLatin} совпадает с \p{Latin} разрушен.

  39. Код, который считает, что \p{InLatin} почти всегда полезен, почти наверняка ошибочен.

  40. Код, который считает, что если $FIRST_LETTER в качестве первой буквы в некотором алфавите и $LAST_LETTER в качестве последней буквы в том же алфавите, что [${FIRST_LETTER}-${LAST_LETTER}] имеет какое-либо значение, почти всегда полностью сломанное и неправильное бессмысленны.

  41. Код, который считает, что чье-то имя может содержать только определенные символы, является глупым, оскорбительным и неправильным.

  42. Код, который пытается уменьшить Unicode до ASCII, не просто ошибочен, его исполнитель никогда не должен снова работать в программировании. Период. Я даже не уверен, что им даже должно быть позволено увидеть снова, так как, очевидно, до сих пор они не сделали много хорошего.

  43. Код, который считает, что есть способ сделать вид, что кодировки текстового файла не существуют, нарушен и опасен. Мог бы тоже высунуть другой глаз.

  44. Код, который преобразует неизвестные символы в ? сломан, глупый, braindead и работает вопреки стандартной рекомендации, в которой говорится, что НЕ ДОЛЖНО СДЕЛАТЬ! RTFM для почему нет.

  45. Кодекс, который считает, что он может надежно угадать, что кодировка немаркированного текстового файла виновата в фатальной смелости высокомерие и наивности, которую исправит только молния от Зевса.

  46. Код, который считает, что вы можете использовать 🐪 ширину printf для прокладки и оправдывать данные Unicode, нарушен и ошибочен.

  47. Код, который верит, как только вы успешно создадите файл по указанному имени, что при запуске ls или readdir в его закрывающей директории вы действительно обнаружите, что файл с именем, созданным вами под ошибкой, является ошибочным, сломанным и неправильным. Не удивляйся этому!

  48. Код, который считает, что UTF-16 является кодировкой с фиксированной шириной, является глупым, сломанным и неправильным. Отмените свою лицензию на программирование.

  49. Код, который обрабатывает кодовые точки от одной плоскости, отличающейся от той, что находится на другой плоскости, ipso facto нарушен и ошибочен. Идти обратно в школу.

  50. Код, который считает, что такие вещи, как /s/i могут совпадать только с символом "S" или "s" , нарушены и ошибочны. Вы будете удивлены.

  51. Код, который использует \PM\pM* для поиска кластеров графема вместо использования \X , сломан и неверен.

  52. Людям, которые хотят вернуться в мир ASCII, следует всемерно поощрять это делать, и в честь их славного обновления они должны быть предоставлены бесплатно с помощью электрической ручной пишущей машинки для всех своих потребностей в вводе данных. Сообщения, отправленные им, должны быть отправлены через телеграф «ᴀʟʟᴄᴀᴘs» по 40 символов в строке и доставлены вручную курьером. СТОП.

🎁 🐪 𝕭𝖔𝖎𝖑𝖊𝖗⸗𝖕𝖑𝖆𝖙𝖊 𝖋𝖔𝖗 𝖀𝖓𝖎𝖈𝖔𝖉𝖊⸗𝕬𝖜𝖆𝖗𝖊 𝕮𝖔𝖉𝖊 🐪 🎁

Мой собственный шаблон в наши дни имеет тенденцию выглядеть так:

use 5.014;

use utf8;
use strict;
use autodie;
use warnings; 
use warnings    qw< FATAL  utf8     >;
use open        qw< :std  :utf8     >;
use charnames   qw< :full >;
use feature     qw< unicode_strings >;

use File::Basename      qw< basename >;
use Carp                qw< carp croak confess cluck >;
use Encode              qw< encode decode >;
use Unicode::Normalize  qw< NFD NFC >;

END { close STDOUT }

if (grep /\P{ASCII}/ => @ARGV) { 
   @ARGV = map { decode("UTF-8", $_) } @ARGV;
}

$0 = basename($0);  # shorter messages
$| = 1;

binmode(DATA, ":utf8");

# give a full stack dump on any untrapped exceptions
local $SIG{__DIE__} = sub {
    confess "Uncaught exception: @_" unless $^S;
};

# now promote run-time warnings into stackdumped exceptions
#   *unless* we're in an try block, in which 
#   case just generate a clucking stackdump instead
local $SIG{__WARN__} = sub {
    if ($^S) { cluck   "Trapped warning: @_" } 
    else     { confess "Deadly warning: @_"  }
};

while (<>)  {
    chomp;
    $_ = NFD($_);
    ...
} continue {
    say NFC($_);
}

__END__

😱 𝕾 𝖀 𝕸 𝕸 𝕬 𝕽 𝖄 😱

Я не знаю, сколько еще «по умолчанию Unicode в 🐪» вы можете получить, чем то, что я написал. Ну, да, я: вы должны использовать Unicode::Collate и Unicode::LineBreak . И, наверное, больше.

Как вы видите, слишком много вещей в Юникоде, которые вам действительно нужно беспокоиться о том, чтобы когда-либо существовала такая вещь, как «по умолчанию для Unicode».

То, что вы собираетесь открыть, как мы уже говорили в 5.8, просто невозможно навязать все эти вещи по коду, который не был разработан с самого начала, чтобы отчитываться за них. Ваш благонамеренный эгоизм просто сломал весь мир.

И даже после того, как вы это сделаете, все еще существуют важные проблемы, требующие большой мысли, чтобы получить право. Нет переключателя, который вы можете перевернуть. Ничего, кроме мозга, и я имею в виду настоящий мозг , хватит здесь. Есть чертовски много вещей, которые вам нужно изучить. Подойдя к ручному пишущей машинке, вы просто не можете надеяться прокрасться по незнанию. Это 21 век, и вы не можете пожелать Юникоду умышленным невежеством.

Вы должны это изучить. Период. Никогда не будет так просто, что «все просто работает», потому что это гарантирует, что многие вещи не сработают, что делает недействительным предположение, что когда-нибудь может быть «заставить все это работать».

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

Как один из примеров, каноническое упорядочение может вызвать некоторые настоящие головные боли. 😭 "\x{F5}" 'õ' , "o\x{303}" 'õ' , "o\x{303}\x{304}" 'ȭ' и "o\x{304}\x{303}" 'ō' должно соответствовать « õ » , но как в мире вы собираетесь это сделать? Это сложнее, чем кажется, но это то, что вам нужно учитывать. 💣

Если есть одна вещь, которую я знаю о Perl, это то, что делают ее Unicode-биты и не делают, и эта вещь, которую я обещаю вам: «ᴛʜᴇʀᴇ ɪs ɴᴏ Uɴɪᴄᴏᴅᴇ ᴍᴀɢɪᴄ ʙᴜʟʟᴇᴛ» 😞

Вы не можете просто изменить некоторые значения по умолчанию и получить плавный переход. Это правда, что я запускаю 🐪 с PERL_UNICODE установленным в "SA" , но это все, и даже это в основном для командной строки. Для настоящей работы я прохожу через все описанные выше шаги, и я делаю это очень внимательно.

😈 ¡ƨdləɥ ƨᴉɥʇ ədoɥ puɐ'λɐp əɔᴉu ɐ əʌɐɥ'ʞɔnl poo⅁ 😈


Мы все согласны с тем, что это сложная проблема по многим причинам, но именно по этой причине она пытается облегчить каждому.

В CPAN используется последний модуль utf8::all , который пытается «включить Unicode. Все это».

Как уже указывалось, вы не можете магически заставить всю систему (внешние программы, внешние веб-запросы и т. Д.) Использовать Unicode, но мы можем работать вместе, чтобы сделать разумные инструменты, облегчающие простые проблемы. Вот почему мы программисты.

Если utf8 :: все не делает то, что, по вашему мнению, должно, давайте улучшим его, чтобы он стал лучше. Или давайте сделаем дополнительные инструменты, которые вместе могут удовлетворить различные потребности людей, а также, возможно.

`


Вы должны включить функцию unicode strings, и это значение по умолчанию, если вы используете v5.14;

Вы не должны использовать идентификаторы unicode esp. для внешнего кода через utf8, поскольку они небезопасны в perl5, только cperl получил это право. См. Например, http://perl11.org/blog/unicode-identifiers.html

Что касается utf8 для ваших файловых дескрипторов / потоков: вам нужно самостоятельно определить кодировку ваших внешних данных. Библиотека не может этого знать, и поскольку даже libc поддерживает utf8, правильные данные utf8 редки. Там больше wtf8, аберрации окон utf8 вокруг.

BTW: Moose на самом деле не «Modern Perl», они просто захватили имя. Moose - идеальный постмодернистский стиль Larry Wall, смешанный с стилем Bjarne Stroustrup, с эклектичной аберрацией правильного синтаксиса perl6, например, с использованием строк для имен переменных, синтаксиса ужасных полей и очень незрелой наивной реализации, которая в 10 раз медленнее, чем надлежащей реализации. cperl и perl6 - настоящие современные перлы, где форма следует за функцией, а реализация уменьшена и оптимизирована.


При чтении этой темы у меня часто возникает впечатление, что люди используют « UTF-8 » как синоним « Unicode ». Проведите различие между «Кодовыми точками» Юникода, которые являются расширенным относительным кодом ASCII и различными «кодировками» Unicode. И есть некоторые из них, из которых UTF-8, UTF-16 и UTF-32 являются текущими, а еще несколько устарели.

Пожалуйста, UTF-8 (как и все другие кодировки ) существует и имеет значение только для ввода или вывода. Внутренне, поскольку Perl 5.8.1, все строки сохраняются как Unicode «Кодовые точки». Правда, вам нужно включить некоторые функции, которые были восхитительно рассмотрены ранее.


Я думаю, вы неправильно понимаете Unicode и его отношение к Perl. Независимо от способа хранения данных, Unicode, ISO-8859-1 или многих других, ваша программа должна знать, как интерпретировать байты, которые она получает в качестве входных данных (декодирования), и как представлять информацию, которую он хочет выводить (кодирование ). Неправильно интерпретируйте эту интерпретацию, и вы разбираете данные. В вашей программе нет какой-то волшебной настройки по умолчанию, которая расскажет вещам вне вашей программы, как действовать.

Вы думаете, что это сложно, скорее всего, потому что вы привыкли ко всему, что ASCII. Все, о чем вы должны думать, просто игнорировалось языком программирования и всеми вещами, с которыми ему приходилось взаимодействовать. Если бы все использовало ничего, кроме UTF-8, и у вас не было выбора, UTF-8 был бы таким же простым. Но не все использует UTF-8. Например, вы не хотите, чтобы ваш дескриптор ввода думал, что он получает октеты UTF-8, если это действительно так, и вы не хотите, чтобы ваши дескрипторы вывода были UTF-8, если считываемая вещь может обрабатывать UTF-8 , Perl не имеет возможности узнать об этом. Вот почему вы программист.

Я не думаю, что Unicode в Perl 5 слишком сложный. Я думаю, что это страшно, и люди избегают этого. Есть разница. С этой целью я поместил Unicode в Learning Perl, 6-е издание , и в « Эффективном программировании на Perl» много элементов Unicode . Вы должны потратить время, чтобы узнать и понять Unicode и как это работает. В противном случае вы не сможете использовать его эффективно.





utf-8