utf-8 Zeichen als hash-key
Hallo,
ich versuche, UTF-8-Zeichen als hash-key zu benutzen, was offenbar nicht
geht. Meine Idee war nun, das UTF-8-Zeichen in eine Nummernfolge o.ä.
umzusetzen und diese als key zu verwenden, leider habe ich dazu nichts
gefunden. Hat jemand eine Idee?
Danke,
Christoph
Re: utf-8 Zeichen als hash-key
Christoph Krempe wrote:
> Hallo,
>
> ich versuche, UTF-8-Zeichen als hash-key zu benutzen, was offenbar nicht
> geht.
Warum sollte das nicht gehen? Was für einen Fehler bekommst Du?
> Meine Idee war nun, das UTF-8-Zeichen in eine Nummernfolge o.ä.
> umzusetzen und diese als key zu verwenden, leider habe ich dazu nichts
> gefunden. Hat jemand eine Idee?
ord();
Gruß,
Ekki
Re: utf-8 Zeichen als hash-key
Am Fri, 11 Jan 2008 15:39:05 +0100 schrieb Ekki Plicht (DF4OR):
> Christoph Krempe wrote:
>
>> Hallo,
>>
>> ich versuche, UTF-8-Zeichen als hash-key zu benutzen, was offenbar
>> nicht geht.
>
> Warum sollte das nicht gehen? Was für einen Fehler bekommst Du?
>
>> Meine Idee war nun, das UTF-8-Zeichen in eine Nummernfolge o.ä.
>> umzusetzen und diese als key zu verwenden, leider habe ich dazu nichts
>> gefunden. Hat jemand eine Idee?
>
> ord();
>
> Gruß,
> Ekki
So wird der hash gefüllt:
$u="Ł";
$utftable['$u'] = "l";
$x=$utftable[Ł];
print "$x\n";
gibt mir aus:
Unrecognized character \xC5
$x=$utftable['Ł'];
gibt mir aus: 0
Re: utf-8 Zeichen als hash-key
Christoph Krempe schrieb:
> Am Fri, 11 Jan 2008 15:39:05 +0100 schrieb Ekki Plicht (DF4OR):
>>
>>> Meine Idee war nun, das UTF-8-Zeichen in eine Nummernfolge o.ä.
>>> umzusetzen und diese als key zu verwenden, leider habe ich dazu nichts
>>> gefunden. Hat jemand eine Idee?
>
> So wird der hash gefüllt:
>
> $u="Ł";
> $utftable['$u'] = "l";
>
> $x=$utftable[Ł];
>
> print "$x\n";
>
> gibt mir aus:
> Unrecognized character \xC5
>
>
> $x=$utftable['Ł'];
> gibt mir aus: 0
Das ist kein perl, was Du das schreibst. Perl benutzt
geschweifte Klammern um Hashelemente zu adressieren
und interpoliert keine Variablen in einfachen Hochkomma.
----------------------------------------------------
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
my %utftable;
my $u="Ł";
$utftable{$u} = "l"; # auch $utftable{"$u"} = "l"; geht
my $x = $utftable{"Ł"};
print "$x\n";
-----------------------------------------------------
Funktioniert problemlos.
-Christian
Re: utf-8 Zeichen als hash-key
Am Fri, 11 Jan 2008 14:57:21 +0000 schrieb Christoph Krempe:
> Am Fri, 11 Jan 2008 15:39:05 +0100 schrieb Ekki Plicht (DF4OR):
>
>> Christoph Krempe wrote:
>>
>>> Hallo,
>>>
>>> ich versuche, UTF-8-Zeichen als hash-key zu benutzen, was offenbar
>>> nicht geht.
>>
>> Warum sollte das nicht gehen? Was für einen Fehler bekommst Du?
>>
>>> Meine Idee war nun, das UTF-8-Zeichen in eine Nummernfolge o.ä.
>>> umzusetzen und diese als key zu verwenden, leider habe ich dazu nichts
>>> gefunden. Hat jemand eine Idee?
>>
>> ord();
>>
>> Gruß,
>> Ekki
>
> So wird der hash gefüllt:
>
> $u="Ł";
> $utftable['$u'] = "l";
>
> $x=$utftable[Ł];
>
> print "$x\n";
>
> gibt mir aus:
> Unrecognized character \xC5
>
>
> $x=$utftable['Ł'];
> gibt mir aus: 0
War mein Fehler, ich hatte ein chomp falsch gesetzt, und den hash mit "["
statt "{" definiert ...
Christoph
Re: utf-8 Zeichen als hash-key
Christoph Krempe:
> So wird der hash gefllt:
>
> $u="L";
> $utftable['$u'] = "l";
Ja, in PHP vielleicht. In Perl solltest du
$utftable{"$u"} = 1;
schreiben, das wird sicher besser funktionieren.
LG, Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: ferdinand.bolhar-nordenkampf [at] wien.gv.at
Re: utf-8 Zeichen als hash-key
Christoph Krempe wrote:
> So wird der hash gefüllt:
>
> $u="Ł";
> $utftable['$u'] = "l";
>
> $x=$utftable[Ł];
>
> print "$x\n";
Abgesehen vom Syntaxfehler willst Du vermutlich folgendes machen:
use strict;
use warnings;
use utf8;
use Text::Undiacritic qw(undiacritic);
$u = 'Ł';
$utftable{$u} = lc( undiacritic( $u ) );
Helmut Wollmersdorfer
Re: utf-8 Zeichen als hash-key
Am Sun, 13 Jan 2008 23:58:05 +0100 schrieb Helmut Wollmersdorfer:
> Christoph Krempe wrote:
>
>> So wird der hash gefüllt:
>>
>> $u="Ł";
>> $utftable['$u'] = "l";
>>
>> $x=$utftable[Ł];
>>
>> print "$x\n";
>
> Abgesehen vom Syntaxfehler willst Du vermutlich folgendes machen:
>
> use strict;
> use warnings;
> use utf8;
>
> use Text::Undiacritic qw(undiacritic);
>
> $u = 'Ł';
> $utftable{$u} = lc( undiacritic( $u ) );
>
> Helmut Wollmersdorfer
Genau!! Das Modul hat mir gefehlt, besten Dank!
Leider bekomme ich bei der Umsetzung meiner Daten folgende Fehler:
Use of uninitialized value in chr at /usr/perl5/site_perl/5.8.4/Text/
Undiacritic.pm line 28, <ALG> line 444.
Use of uninitialized value in substitution (s///) at /usr/perl5/
site_perl/5.8.4/Text/Undiacritic.pm line 27, <ALG> line 453.
Use of uninitialized value in pattern match (m//) at /usr/perl5/5.8.4/lib/
charnames.pm line 303, <ALG> line 453.
Use of uninitialized value in exists at /usr/perl5/5.8.4/lib/charnames.pm
line 305, <ALG> line 453.
Use of uninitialized value in concatenation (.) or string at /usr/
perl5/5.8.4/lib/charnames.pm line 309, <ALG> line 453.
Use of uninitialized value in chr at /usr/perl5/site_perl/5.8.4/Text/
Undiacritic.pm line 28, <ALG> line 453.
Use of uninitialized value in substitution (s///) at /usr/perl5/
site_perl/5.8.4/Text/Undiacritic.pm line 27, <ALG> line 490.
Use of uninitialized value in pattern match (m//) at /usr/perl5/5.8.4/lib/
charnames.pm line 303, <ALG> line 490.
Use of uninitialized value in exists at /usr/perl5/5.8.4/lib/charnames.pm
line 305, <ALG> line 490.
Use of uninitialized value in concatenation (.) or string at /usr/
perl5/5.8.4/lib/charnames.pm line 309, <ALG> line 490.
Use of uninitialized value in chr at /usr/perl5/site_perl/5.8.4/Text/
Undiacritic.pm line 28, <ALG> line 490.
Ich vermute, das hängt mit der Art meiner Eingabedaten zusammen, sie
bestehen u.a. aus \x00 und \x01-Zeichen, sind also keine reinen UTF8-
Daten. Ich will einfach die Eingabedatei Satz für Satz auf das vorkommen
von UTF-8-Zeichen prüfen und jeweils den Grundbuchstaben zurückgeben.
Ein anderes Problem ist, daß der split in meinem Progrämchen offenbar
byteweise, nicht zeichenweise arbeitet:
use strict;
use warnings;
use utf8;
use Text::Undiacritic qw(undiacritic);
while(<ALG>){
my $kopf="";
my $zeichen="";
my [at] satz = split(/ [at] [at] [at] /, $_); # nur den Teil bis " [at] [at] [at] "
my [at] ssatz = split(//,$satz[0]);
foreach $zeichen ( [at] ssatz) {
$s = lc(undiacritic($zeichen));
$kopf .= $zeichen;
}
print $kopf$satz[1]; # Kopf + Rest d. Satzes
}
Ein "print "$zeichen\n"; _vor_ dem undiacritic bringt im Fall von "ö"
zwei Zeichen statt "ö".
Re: utf-8 Zeichen als hash-key
Am Mon, 14 Jan 2008 09:38:10 +0000 schrieb Christoph Krempe:
> Am Sun, 13 Jan 2008 23:58:05 +0100 schrieb Helmut Wollmersdorfer:
>
>> Christoph Krempe wrote:
>>
>>> So wird der hash gefüllt:
>>>
>>> $u="Ł";
>>> $utftable['$u'] = "l";
>>>
>>> $x=$utftable[Ł];
>>>
>>> print "$x\n";
>>
>> Abgesehen vom Syntaxfehler willst Du vermutlich folgendes machen:
>>
>> use strict;
>> use warnings;
>> use utf8;
>>
>> use Text::Undiacritic qw(undiacritic);
>>
>> $u = 'Ł';
>> $utftable{$u} = lc( undiacritic( $u ) );
>>
>> Helmut Wollmersdorfer
>
> Genau!! Das Modul hat mir gefehlt, besten Dank!
>
> Leider bekomme ich bei der Umsetzung meiner Daten folgende Fehler:
>
> Use of uninitialized value in chr at /usr/perl5/site_perl/5.8.4/Text/
> Undiacritic.pm line 28, <ALG> line 444. Use of uninitialized value in
> substitution (s///) at /usr/perl5/ site_perl/5.8.4/Text/Undiacritic.pm
> line 27, <ALG> line 453. Use of uninitialized value in pattern match
> (m//) at /usr/perl5/5.8.4/lib/ charnames.pm line 303, <ALG> line 453.
> Use of uninitialized value in exists at
> /usr/perl5/5.8.4/lib/charnames.pm line 305, <ALG> line 453.
> Use of uninitialized value in concatenation (.) or string at /usr/
> perl5/5.8.4/lib/charnames.pm line 309, <ALG> line 453. Use of
> uninitialized value in chr at /usr/perl5/site_perl/5.8.4/Text/
> Undiacritic.pm line 28, <ALG> line 453. Use of uninitialized value in
> substitution (s///) at /usr/perl5/ site_perl/5.8.4/Text/Undiacritic.pm
> line 27, <ALG> line 490. Use of uninitialized value in pattern match
> (m//) at /usr/perl5/5.8.4/lib/ charnames.pm line 303, <ALG> line 490.
> Use of uninitialized value in exists at
> /usr/perl5/5.8.4/lib/charnames.pm line 305, <ALG> line 490.
> Use of uninitialized value in concatenation (.) or string at /usr/
> perl5/5.8.4/lib/charnames.pm line 309, <ALG> line 490. Use of
> uninitialized value in chr at /usr/perl5/site_perl/5.8.4/Text/
> Undiacritic.pm line 28, <ALG> line 490.
>
> Ich vermute, das hängt mit der Art meiner Eingabedaten zusammen, sie
> bestehen u.a. aus \x00 und \x01-Zeichen, sind also keine reinen UTF8-
> Daten. Ich will einfach die Eingabedatei Satz für Satz auf das vorkommen
> von UTF-8-Zeichen prüfen und jeweils den Grundbuchstaben zurückgeben.
>
> Ein anderes Problem ist, daß der split in meinem Progrämchen offenbar
> byteweise, nicht zeichenweise arbeitet:
>
> use strict;
> use warnings;
> use utf8;
> use Text::Undiacritic qw(undiacritic);
>
>
> while(<ALG>){
> my $kopf="";
> my $zeichen="";
> my [at] satz = split(/ [at] [at] [at] /, $_); # nur den Teil bis " [at] [at] [at] "
> my [at] ssatz = split(//,$satz[0]);
> foreach $zeichen ( [at] ssatz) {
> $s = lc(undiacritic($zeichen));
> $kopf .= $zeichen;
> }
> print $kopf$satz[1]; # Kopf + Rest d. Satzes
> }
>
>
> Ein "print "$zeichen\n"; _vor_ dem undiacritic bringt im Fall von "ö"
> zwei Zeichen statt "ö".
Das Problem liegt woanders: Unter Linux (32bit) funktioniert
split(//,$string) wie erwartet, unter Solaris10 (64bit) nicht ...
Danke für die Hinweise!
Christoph
Re: utf-8 Zeichen als hash-key
On 2008-01-14 09:38, Christoph Krempe <krempe [at] ub.fu-berlin.de> wrote:
> Ich vermute, das hngt mit der Art meiner Eingabedaten zusammen, sie
> bestehen u.a. aus \x00 und \x01-Zeichen, sind also keine reinen UTF8-
> Daten.
Was ist an \x00 und \x01 nicht UTF-8?
> Ich will einfach die Eingabedatei Satz fr Satz auf das vorkommen
> von UTF-8-Zeichen prfen und jeweils den Grundbuchstaben zurckgeben.
>
> Ein anderes Problem ist, da der split in meinem Progrmchen offenbar
> byteweise, nicht zeichenweise arbeitet:
split arbeitet mit dem was es bekommt: Wenn Du einen Character-String
splittest, arbeitet es zeichenweise, wenn Du einen Bytestring splittest,
(natrlich) byteweise.
Also ...
> use strict;
> use warnings;
> use utf8;
> use Text::Undiacritic qw(undiacritic);
>
>
> while(<ALG>){
> my $kopf="";
> my $zeichen="";
> my [at] satz = split(/ [at] [at] [at] /, $_); # nur den Teil bis " [at] [at] [at] "
.... ist hier vermutlich $_ ein Bytestring.
Wo kommt $_ her? Es wird ein paar Zeilen vorher von ALG gelesen.
Wie wurde ALG geffnet? Das hast Du uns nicht mitgeteilt.
hp
PS: Folgende Routine ist gelegentlich recht praktisch:
sub dumpstr {
my ($s) = [at] _;
print utf8::is_utf8($s) ? "char" : "byte";
print ":";
for (split //, $s) {
printf " %#02x", ord($_);
}
print "\n";
}