Как я читаю UTF-8 с ромбовидным оператором (<>)?

public class ShuffleArray {
public static void shuffleArray(int[] a) {
    int n = a.length;
    Random random = new Random();
    random.nextInt();
    for (int i = 0; i < n; i++) {
        int change = i + random.nextInt(n - i);
        swap(a, i, change);
    }
}

private static void swap(int[] a, int i, int change) {
    int helper = a[i];
    a[i] = a[change];
    a[change] = helper;
}

public static void main(String[] args) {
    int[] a = new int[] { 1, 2, 3, 4, 5, 6, 6, 5, 4, 3, 2, 1 };
    shuffleArray(a);
    for (int i : a) {
        System.out.println(i);
    }
}
}
41
задан brian d foy 7 February 2009 в 10:08
поделиться

3 ответа

Попытайтесь использовать прагму, открытую вместо этого:

use strict;
use warnings;
use open qw(:std :utf8);

while(<>){
    my @chars = split //, $_;
    print "$_" foreach(@chars);
}

Необходимо сделать это, потому что <> оператор является волшебным. Поскольку Вы знаете, что это будет читать из STDIN или из файлов в @ARGV. Чтение из STDIN не вызывает проблемы, поскольку STDIN уже открыт таким образом binmode работы хорошо над ним. Проблема при чтении из файлов в @ARGV, когда сценарий запускает и называет binmode, файлы не открыты. Это заставляет STDIN быть установленным на UTF-8, но этот канал IO не используется, когда @ARGV имеет файлы. В этом случае <> оператор открывает новый дескриптор файла для каждого файла в @ARGV. Каждый дескриптор файла сбрасывается и проигрывает, это - атрибут UTF-8. При помощи прагмы открывают Вас, вынуждают каждый новый STDIN быть в UTF-8.

58
ответ дан potyl 26 November 2019 в 23:39
поделиться

Можно включить UTF8 по умолчанию с эти -C флаг:

perl -CSD -ne 'print join("\n",split //);' utf8.txt

переключатель -CSD включает UTF8 безусловно; если Вы будете использовать просто -C, то это включит UTF8, только если соответствующие переменные среды (LC_ALL, LC_TYPE и LANG) указывают так. См. perlrun для деталей.

Это не рекомендуется, если Вы не вызываете жемчуг непосредственно (в частности, он не мог бы работать надежно при передаче опций жемчугу от строки хижины). См. другие ответы в этом случае.

9
ответ дан Bruno De Fraine 23 September 2019 в 15:13
поделиться

Ваш сценарий работает, если Вы делаете это:

#!/usr/bin/perl -w

binmode STDOUT, ':utf8';

while(<>){
    binmode ARGV, ':utf8';

    my @chars = split //, $_;
    print "$_\n" foreach(@chars);
}

Волшебный дескриптор файла, что <> чтения от назван *ARGV, и это открыто при вызове readline.

Но действительно, я - поклонник явного использования Encode::decode и Encode::encode в надлежащих случаях.

17
ответ дан jrockway 26 November 2019 в 23:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: