/ / Ako môžem vygenerovať utf-8 z Perl? - perl, unicode, utf-8

Ako môžem vygenerovať utf-8 z Perl? - perl, unicode, utf-8

Snažím sa napísať Perl skript pomocou"utf8" pragma a mám neočakávané výsledky, používam Mac OS X 10.5 (Leopard) a upravujem s TextMate.Všetky moje nastavenia pre môj editor a operačný systém sú predvolené pri písaní súborov utf-8.

Keď však do textového súboru zadám nasledujúci text, uložím ho ako ".pl" a vykonám ho, získam priateľský "diamant s otáznikom" namiesto znakov iných ako ASCII.

#!/usr/bin/env perl -w

use strict;
use utf8;

my $str = "Çirçös";
print( "$strn" );

Akákoľvek myšlienka, čo mám robiť zle? Očakávam, že dostanem "Çirçös" na výstupe, ale mám " ir s" namiesto toho.

odpovede:

143 pre odpoveď č. 1

use utf8; nepovolí Unicode výkon - umožňuje vo vašom programe písať Unicode. Pridajte to do programu pred vašou print() vyhlásenie:

binmode(STDOUT, ":utf8");

Zistite, či to pomáha. To by malo byť STDOUT výstup v utf-8 namiesto obyčajného ASCII.


75 pre odpoveď č. 2

Môžete použiť otvorená pragma.

Napr. nižšie nastavuje STDOUT, STDIN & STDERR na použitie utf-8 ...

use open qw/:std :utf8/;

59 pre odpoveď č. 3

TMTOWTDI, si vybral metódu, ktorá najlepšie vyhovuje práci. Používam metódu životného prostredia, aby som o tom nemusela premýšľať.

V prostredie:

export PERL_UNICODE=SDL

na príkazový riadok:

perl -CSDL -le "print "x{1815}"";

alebo s binmode:

binmode(STDOUT, ":utf8");          #treat as if it is utf-8
binmode(STDIN, ":encoding(utf8)"); #actually check if it is utf-8

alebo s Perlite:

open my $fh, ">:utf8", $filename
or die "could not open $filename: $!n";

open my $fh, "<:encoding(utf-8)", $filename
or die "could not open $filename: $!n";

alebo s otvorená pragma:

use open ":encoding(utf8)";
use open IN => ":encoding(utf8)", OUT => ":utf8";

1 pre odpoveď č. 4

Tiež chcete povedať, že reťazce vo vašom kóde sú utf-8. vidieť Prečo sa moderné Perl predvolene vyhýba utf-8?, Tak nastavte nielen PERL_UNICODE=SDAL ale tiež PERL5OPT=-Mutf8.


0 pre odpoveď č. 5

Ďakujem, nakoniec dostal riešenie, aby sme neukladali utf8 ::kódovať celý kód. Syntetizovať a dokončiť pre iné prípady, ako napísať a čítať súbory v utf8 a tiež pracovať s LoadFile súboru YAML v utf8

use utf8;
use open ":encoding(utf8)";
binmode(STDOUT, ":utf8");

open(FH, ">test.txt");
print FH "something éá";

use YAML qw(LoadFile Dump);
my $PUBS = LoadFile("cache.yaml");
my $f = "2917";
my $ref = $PUBS->{$f};
print "$f "".$ref->{name}."" ". $ref->{primary_uri}." ";

kde cache.yaml je:

---
2917:
id: 2917
name: Semanário
primary_uri: 2917.xml

-3 pre odpoveď č. 6

robiť vo vašom shell: $ env | grep LANG

Pravdepodobne to ukáže, že váš shell nepoužíva lokality utf-8.