🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.perl
6 messages
6 total messages Started by Mateusz Szczyrzyca Tue, 07 Jun 2011 14:36
UTF8 w systemie
#52242
Author: Mateusz Szczyrzyca
Date: Tue, 07 Jun 2011 14:36
59 lines
1950 bytes
Mam mały problem, zdawało mi się do tej pory, że w systemie utf8 mam 
dobrze skonfigurowany. Teraz już nic nie wiem.

#v+
$ cat testek 
Żążółć gęstą jaźń
[06-06-2011] [16:30:11] [mateusz@mateusz] [/home/mateusz] 
$ file testek 
testek: UTF-8 Unicode text
#v-

Pliki edytuję vimem, więc:

#v+
$ grep utf .vimrc 
set fileencodings=utf-8
set encoding=utf-8
#v-

A ponadto:
#v+
$ locale
LANG=
LC_CTYPE="pl_PL.UTF-8"
LC_NUMERIC="pl_PL.UTF-8"
LC_TIME="pl_PL.UTF-8"
LC_COLLATE="pl_PL.UTF-8"
LC_MONETARY="pl_PL.UTF-8"
LC_MESSAGES="pl_PL.UTF-8"
LC_PAPER="pl_PL.UTF-8"
LC_NAME="pl_PL.UTF-8"
LC_ADDRESS="pl_PL.UTF-8"
LC_TELEPHONE="pl_PL.UTF-8"
LC_MEASUREMENT="pl_PL.UTF-8"
LC_IDENTIFICATION="pl_PL.UTF-8"
LC_ALL=pl_PL.UTF-8
#v-

I prosty skrypt pisany w tym vimie w tych locales:

#v+
$ cat test.pl 
#!/usr/bin/perl -w

use strict;
use warnings;
use utf8;
use locale;

print "Zażółć gęstą jaźń\n";
$ ./test.pl 
Wide character in print at ./test.pl line 8.
Zażółć gęstą jaźń
#v-

Oczywiście to wszystko  z/bez `use utf8` i/lub `use locale`

Ten warning od perla psuje mi skrypt CGI, zatem: co tu jest źle?
Serio to nie jest w utf8?
Re: UTF8 w systemie
#52243
Author: Andrzej Adam Filip
Date: Tue, 07 Jun 2011 15:07
36 lines
2367 bytes
Mateusz Szczyrzyca <mateusz@abstynenci.pl> pisze:
> [...]
> I prosty skrypt pisany w tym vimie w tych locales:
>
> #v+
> $ cat test.pl 
> #!/usr/bin/perl -w
>
> use strict;
> use warnings;
> use utf8;
> use locale;
>
> print "Zażółć gęstą jaźń\n";
> $ ./test.pl 
> Wide character in print at ./test.pl line 8.
> Zażółć gęstą jaźń
> #v-
>
> Oczywiście to wszystko  z/bez `use utf8` i/lub `use locale`
>
> Ten warning od perla psuje mi skrypt CGI, zatem: co tu jest źle?
> Serio to nie jest w utf8?

To (zapewne) jest w UTF-8 ale perl traktuje STDOUT jako ascii/byte
stream. Można temu zaradzić np. linijką poniżej przed "print":
  binmode(STDOUT,'utf8');

Ja osobiście wolę się trzymać tego że pliki są domyślnie
bajtami/oktetami i przełączać jawnie poszczególne pliki/strumienie.
Zapewne dostaniesz alternatywne rady jak sobie poradzić z tym warningiem :-)

-- 
Andrzej Adam Filip : anfi@onet.eu : Andrzej.Filip@gmail.com
Jasność - podstawowa wartość rzeczy.
  -- Arystoteles (384-322 p.n.e.)
Re: UTF8 w systemie
#52244
Author: Stachu 'Dozzie' K.
Date: Tue, 07 Jun 2011 16:05
34 lines
2020 bytes
On 2011-06-07, Mateusz Szczyrzyca <mateusz@abstynenci.pl> wrote:
> Mam mały problem, zdawało mi się do tej pory, że w systemie utf8 mam 
> dobrze skonfigurowany. Teraz już nic nie wiem.
[...]
> I prosty skrypt pisany w tym vimie w tych locales:
>
> #v+
> $ cat test.pl 
> #!/usr/bin/perl -w
>
> use strict;
> use warnings;
> use utf8;
> use locale;
>
> print "Zażółć gęstą jaźń\n";
> $ ./test.pl 
> Wide character in print at ./test.pl line 8.
> Zażółć gęstą jaźń
> #v-

Bo `use locale' robi trochę co innego niż ci się wydaje. Zmienia tylko
zachowanie paru funkcji i operatorów do porównywania stringów (np.
sort(), cmp).

To co ty chcesz zrobić, załatwia się przez `use encoding ":locale"'
albo (dla przenośności nawet lepiej) przez `use encoding "utf8"'.

perldoc perllocale (sekcja "The use locale pragma")
perldoc encoding

-- 
Secunia non olet.
Stanislaw Klekot
Re: UTF8 w systemie
#52245
Author: Mirosław Zalewski
Date: Tue, 07 Jun 2011 19:18
13 lines
1115 bytes
Koledzy dali Ci wędkę, ja zaś dam rybę:

#v+
use Encode;

print encode("UTF-8", "Zażółć gęstą jaźń\n");
#v-

Alternatywnie możesz po prostu w środowisku produkcyjnym usunąć „use 
warnings”, ale to przynajmniej kontrowersyjna decyzja.
-- 
Niżej podpisany, zamieszkały w http://minio.xt.pl ,
                       Mirosław Zalewski
Re: UTF8 w systemie
#52246
Author: Szymon Sokół
Date: Tue, 07 Jun 2011 21:39
27 lines
2213 bytes
On Tue, 07 Jun 2011 21:18:16 +0200, Mirosław Zalewski wrote:

> Koledzy dali Ci wędkę, ja zaś dam rybę:
> 
> #v+
> use Encode;
> 
> print encode("UTF-8", "Zażółć gęstą jaźń\n");
> #v-
> 
> Alternatywnie możesz po prostu w środowisku produkcyjnym usunąć „use 
> warnings”, ale to przynajmniej kontrowersyjna decyzja.

Metoda Dozziego (ta druga, z "use encoding 'utf8';") jest lepsza (nie wymaga
dawania encode w każdym princie...)
W onelinerach można użyć opcji CLI "-CDS", daje podobny efekt.

Oraz czepię się analnoretentywnie, że zdanie testowe powinno brzmieć "zażółć
*gęślą* jaźń", żeby zawierać wszystkie polskie znaki (w tym "ś"); a że wtedy
jest nieco bez sensu, to ja preferuję inne zdania testowe spośród podanych
na http://hekate-design.pl/test/

-- 
Szymon Sokół (SS316-RIPE) -- Network Manager                                 B
Computer Center, AGH - University of Science and Technology, Cracow, Poland  O
http://home.agh.edu.pl/szymon/ PGP key id: RSA: 0x2ABE016B, DSS: 0xF9289982  F
Free speech includes the right not to listen, if not interested -- Heinlein  H
Re: UTF8 w systemie
#52247
Author: Mateusz Szczyrzyca
Date: Wed, 08 Jun 2011 11:08
8 lines
1046 bytes
Dnia 07.06.2011 Mateusz Szczyrzyca <mateusz@abstynenci.pl> napisał/a:

> [...]

Dzięki wszystkim za odpowiedzi - oczywiście każda okazała się pomocna.
Poradziłem z tym problemem na jeszcze inny sposób (jak to w Perlu).

Pozdrawiam.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads