Проблема кодирования с использованием новой строки в perl - PullRequest
2 голосов
/ 14 февраля 2020

Программа работает до тех пор, пока я печатаю только специальные символы. Но я хочу, чтобы они были отделены и отсортированы. С помощью команды новой строки символы превращаются в знаки вопроса. Может кто-нибудь сказать мне, почему и как решить эту проблему?

#!/usr/bin/perl

while (<>) {
  while (/(.)/g) {
    if (ord($1) >= 128){
       print "$1\n";      
    }
  }
}

Ответы [ 2 ]

4 голосов
/ 14 февраля 2020

При открытии файла не в формате ASCII вы должны указать Perl в какой кодировке находится файл. При печати этих символов, опять же, вы должны указать, как они должны кодироваться на выходе.

Например, для обработки символов в кодировке UTF-8, добавьте следующее к вашему коду:

use open IO => ':encoding(UTF-8)', ':std';

Подробнее см. открыто .

0 голосов
/ 14 февраля 2020

Вы используете UNIX систему, не понятно, какой терминал и какие настройки для LOCALE у вас в вашей среде.

В зависимости от настроек LOCALE не все символы будут печататься на консоли, и вместо этого вы увидите ? . Некоторые символы не предназначены для печати вообще (управляющие символы, которые нельзя визуализировать).

У вас есть два варианта:

  • настроить параметры LOCALE в соответствии с используемыми символами
  • перекодировать ввод и вывод в поддерживаемый LOCALE

Также ваш код, вероятно, будет легче прочитать в следующей форме

use strict;
use warnings;
use feature 'say';

my $debug = 0;

while (<DATA>) {
    chomp;
    say     if $debug;
    map{ my $d = ord; print "[$d]" } split '';
    say ''  if $debug;;
}

__DATA__
use strict;
use warnings;
use feature 'say';

while (<>) {
    say;
    map{ my $d = ord; print "[$d]" if $d >= 128 } split '', $_;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...