Perl6 (Rakudo) - Как обрабатывать специальные символы из файла?

Как я могу читать специальные символы из внешнего файла? Вот простой .txt файл на французском языке, содержание которого является первым абзацем https://fr.lipsum.com/: как вы можете видеть на моем скриншоте, кодировка файла - UTF-8, но акценты отображаются неправильно.

Я пробовал различные кодировки в блокноте ++ и в моем сценарии perl6, например:

enc => "utf8"
enc => "latin1"

Со скриптами Python или Ruby я не сталкиваюсь с проблемой. Я не могу найти точного примера по этому поводу, вероятно, потому, что perl 6 еще совсем недавно (??). Спасибо.

Мой скрипт, как он изображен на скриншоте:

my $text_contents = slurp "testfile.txt", enc => "utf8";
say $text_contents;
prompt;

Сценарий Perl6, входной файл в блокноте ++, exec в cmd.exe


Окончательное редактирование: решение состоит в том, чтобы включить опцию, доступную в бета-версии с Windows 10 1803, чтобы заставить ОС правильно обрабатывать символы Юникода: см. ответы и комментарии ниже ...


person Frenzowski    schedule 15.03.2019    source источник
comment
Укажите кодировку, используемую для файла .txt (как показано на снимке экрана), а также предоставьте фрагмент файла .txt в виде текста (а не изображения) в вашем вопросе. Вы также должны опубликовать скрипт perl 6 в виде текста, это поможет нам скопировать и вставить, пытаясь воспроизвести ваше поведение. Спасибо!   -  person Håkon Hægland    schedule 15.03.2019
comment
По умолчанию slurp читается как UTF-8 (и на скриншоте видно, что это кодировка вашего файла). Что произойдет, если вы создадите символ UTF8 непосредственно в perl6, а затем выведете его? EG: perl6 -e 'say "\c[Latin Small Letter A with Acute]"' Если это выводит á, тогда все в порядке. В противном случае проблема не в чтении файла, а в вашей командной строке не может обрабатываться вывод UTF8. Однако у меня под рукой нет Windows-машины, на которой можно было бы ее протестировать.   -  person Scimon Proctor    schedule 15.03.2019
comment
Еще одна проверка для запуска type testfile.txt правильно ли выводит символ utf8?   -  person Scimon Proctor    schedule 15.03.2019
comment
@Scimon: В cmd.exe первая указанная вами команда не работает: perl6 -e 'say "\c[Latin Small Letter A with Acute]"' === ИЗВИНИТЕ! === Ошибка при компиляции -e Невозможно проанализировать выражение в одинарных кавычках; не удалось найти финал '(соответствующий начальный элемент был в строке 1) at -e: 1 ------ ›' say ‹HERE› ‹EOL›, ожидая любого из: термин в одинарных кавычках   -  person Frenzowski    schedule 15.03.2019
comment
type testfile.txt дает тот же результат, что и Ракудо   -  person Frenzowski    schedule 15.03.2019
comment
Так вот в чем проблема. Ваша консоль не может правильно отображать UTF8. stackoverflow .com / questions / 388490 / Этот ответ может помочь.   -  person Scimon Proctor    schedule 15.03.2019
comment
Проблема с этой командой заключается в том, что Windows cmd обрабатывает одинарные кавычки как обычный символ. Пожалуйста, попробуйте perl6 -e "say qq/\c[Latin Small Letter A with Acute]/". У вас есть Windows PowerShell на вашем компьютере? Я рекомендую попробовать ту же команду, чтобы увидеть, не возникнет ли у вас та же проблема. (Приносим извинения за отсутствие разрывов строк, мобильный сайт SO, похоже, не позволяет мне правильно их вводить)   -  person Daniel Mita    schedule 15.03.2019
comment
@DanielMita Как в CMD, так и в Powershell: >perl6 -e "say qq/\c[Latin Small Letter A with Acute]/" >├í ps: Я недавно публикую на SO, мне не удалось включить разрывы строк (даже с двумя пробелами в конце строки)   -  person Frenzowski    schedule 15.03.2019
comment
@Scimon Спасибо за ссылку, к сожалению, она очень длинная, поэтому я бы хотел найти tl; dr для этого   -  person Frenzowski    schedule 15.03.2019


Ответы (1)


Если вы не используете Windows

Это СО либо полностью, либо почти не имеет для вас никакого отношения.

Если вы используете Windows 10

Проверьте Бета: Использовать Unicode UTF-8 для опции языковой поддержки по всему миру.

По крайней мере, в то время, когда я изначально писал этот ответ, текст рядом с этим флажком, относящимся к Unicode, утверждал, что он предназначен для программ, которые не поддерживают Unicode, но вы должны просто игнорировать это. [1]

В то время, когда я изначально писал этот ответ, флажок был найден под панелью управления, записью региона, вкладкой «Администрация», кнопкой «Изменить языковой стандарт системы».

Microsoft, возможно, изменила этот материал с тех пор, как я написал этот ответ, и может изменить его снова, например, переместив и / или переименовав флажок, или сделав что-то более сложным, чем просто установка одного флажка.

Согласно их комментарию под этим ответом, OP отмечает:

Для тех, кто заинтересован в этой конкретной опции, ее можно найти в устаревшей Панели управления Windows - ›Регион -› Административная - ›Изменить настройки ...

Если вы используете старую версию Windows

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

Плохая новость в том, что они сделали много ошибок в старых версиях Windows (и даже в Windows 10, которую они сейчас пытаются исправить), поэтому любое решение будет ограничено этими ошибками. (Возможно, самая большая проблема - это двусмысленность Microsoft по теме [1], но будем надеяться, что мы сможем обойти это.)

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


Цитата из страницы Википедии Unicode в Microsoft Windows:

они все еще в 2018 году улучшают поддержку своей операционной системы для UTF-8

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

Но их определенно еще нет - не во время первоначального написания этого ответа, и, я подозреваю, не в течение следующих N лет - по крайней мере, поскольку у многих конечных пользователей что-то не работает правильно из коробки. Я думаю, что это корень большинства проблем с Unicode в Windows.

Старые языки, такие как Python, Ruby и Perl, предложили ряд уловок, которые скрывали многие проблемы со старой поддержкой Microsoft UTF8 от большинства пользователей в простых сценариях, используя то, что Microsoft иронично называла поддержкой Unicode.

Это всегда сопровождалось компромиссом: все становилось очень сложным или даже совершенно непригодным для работы с более сложными приложениями во многих регионах по всему миру. (Настолько, что даже могущественная Microsoft наконец капитулировала в 2018 году.)

По сути, до тех пор, пока Microsoft не попыталась использовать эту программу, у программного обеспечения, работающего в Windows, не было альтернативы, кроме как использовать принципиально нарушенную поддержку Unicode, или фактически поддерживать Unicode должным образом. [1]

Раку и Ракудо сосредоточились на последнем, и проблемы с ним при запуске в Windows связаны с этим противоречием старому ошибочному подходу Microsoft. К счастью, Microsoft сейчас внедряет программу, и поэтому мы, возможно, сможем найти способ обойти проблемы, возникающие у вас с Unicode в Windows, при условии, что вы проявите терпение.

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

Сноски

[1] Когда я изначально писал этот ответ, рядом с флажком был текст, указывающий, что он предназначен для программ, которые не поддерживают Unicode. Это полная противоположность тому, что происходит на самом деле, но эй, это Microsoft.

person raiph    schedule 16.03.2019
comment
Я просто пробую Perl6 из любопытства и признаю, что немного ленив, поэтому думаю, что подожду, пока не будут внесены улучшения, чтобы согласовать Perl6 и специальные символы вместе. Большое спасибо за развернутый ответ! - person Frenzowski; 17.03.2019
comment
Hi @Frenzowski P6 основан на использовании Unicode, поэтому он хорошо работает с Unicode. Я не уверен, что он когда-либо решит проблемы, связанные с символами, отличными от Unicode, и я сомневаюсь, что Microsoft когда-либо внесет изменение, кроме того, которое они пробуют в Windows 10. Вы используете Windows 10? Если это так, я надеюсь, что вы не настолько ленивы, что не пытались щелкнуть опцию, предоставленную Microsoft, и мне любопытно, что произошло. В противном случае было бы полезно узнать, какую версию Windows вы используете. Спасибо за любой ответ. - person raiph; 17.03.2019
comment
Привет @raiph, ты прав, я не такой ленивый. Да, я использую Windows 10, и на самом деле я думал, что речь идет о загрузке бета-версии ОС. Я такой глупый. Я просто проверил эту опцию, перезапустил свой компьютер и с помощью команды type <filename> добился правильного отображения символов в UTF-8. Аллилуиа! Для тех, кто заинтересован в этой конкретной опции, ее можно найти в устаревшей панели управления Windows - ›Регион -› Административные - ›Изменить настройки ... Спасибо, что вернули мое внимание к этой теме - person Frenzowski; 18.03.2019