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ď č. 1use 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.