utf-8 Zeichen als hash-key
utf-8 Zeichen als hash-key
am 11.01.2008 15:27:39 von Christoph Krempe
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
am 11.01.2008 15:39:05 von 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
Re: utf-8 Zeichen als hash-key
am 11.01.2008 15:57:21 von 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
Re: utf-8 Zeichen als hash-key
am 11.01.2008 17:04:31 von Christian Winter
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 11.01.2008 17:05:57 von Christoph Krempe
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
am 11.01.2008 19:57:58 von Ferry Bolhar
Christoph Krempe:
> So wird der hash gefüllt:
>
> $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@wien.gv.at
Re: utf-8 Zeichen als hash-key
am 13.01.2008 23:58:05 von 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
Re: utf-8 Zeichen als hash-key
am 14.01.2008 10:38:10 von 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, line 444.
Use of uninitialized value in substitution (s///) at /usr/perl5/
site_perl/5.8.4/Text/Undiacritic.pm line 27, line 453.
Use of uninitialized value in pattern match (m//) at /usr/perl5/5.8.4/lib/
charnames.pm line 303, line 453.
Use of uninitialized value in exists at /usr/perl5/5.8.4/lib/charnames.pm
line 305, line 453.
Use of uninitialized value in concatenation (.) or string at /usr/
perl5/5.8.4/lib/charnames.pm line 309, line 453.
Use of uninitialized value in chr at /usr/perl5/site_perl/5.8.4/Text/
Undiacritic.pm line 28, line 453.
Use of uninitialized value in substitution (s///) at /usr/perl5/
site_perl/5.8.4/Text/Undiacritic.pm line 27, line 490.
Use of uninitialized value in pattern match (m//) at /usr/perl5/5.8.4/lib/
charnames.pm line 303, line 490.
Use of uninitialized value in exists at /usr/perl5/5.8.4/lib/charnames.pm
line 305, line 490.
Use of uninitialized value in concatenation (.) or string at /usr/
perl5/5.8.4/lib/charnames.pm line 309, line 490.
Use of uninitialized value in chr at /usr/perl5/site_perl/5.8.4/Text/
Undiacritic.pm line 28, 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(){
my $kopf="";
my $zeichen="";
my @satz = split(/@@@/, $_); # nur den Teil bis "@@@"
my @ssatz = split(//,$satz[0]);
foreach $zeichen (@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 14.01.2008 14:07:33 von Christoph Krempe
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, line 444. Use of uninitialized value in
> substitution (s///) at /usr/perl5/ site_perl/5.8.4/Text/Undiacritic.pm
> line 27, line 453. Use of uninitialized value in pattern match
> (m//) at /usr/perl5/5.8.4/lib/ charnames.pm line 303, line 453.
> Use of uninitialized value in exists at
> /usr/perl5/5.8.4/lib/charnames.pm line 305, line 453.
> Use of uninitialized value in concatenation (.) or string at /usr/
> perl5/5.8.4/lib/charnames.pm line 309, line 453. Use of
> uninitialized value in chr at /usr/perl5/site_perl/5.8.4/Text/
> Undiacritic.pm line 28, line 453. Use of uninitialized value in
> substitution (s///) at /usr/perl5/ site_perl/5.8.4/Text/Undiacritic.pm
> line 27, line 490. Use of uninitialized value in pattern match
> (m//) at /usr/perl5/5.8.4/lib/ charnames.pm line 303, line 490.
> Use of uninitialized value in exists at
> /usr/perl5/5.8.4/lib/charnames.pm line 305, line 490.
> Use of uninitialized value in concatenation (.) or string at /usr/
> perl5/5.8.4/lib/charnames.pm line 309, line 490. Use of
> uninitialized value in chr at /usr/perl5/site_perl/5.8.4/Text/
> Undiacritic.pm line 28, 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(){
> my $kopf="";
> my $zeichen="";
> my @satz = split(/@@@/, $_); # nur den Teil bis "@@@"
> my @ssatz = split(//,$satz[0]);
> foreach $zeichen (@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
am 15.01.2008 19:55:29 von hjp-usenet2
On 2008-01-14 09:38, Christoph Krempe wrote:
> 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.
Was ist an \x00 und \x01 nicht UTF-8?
> 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:
split arbeitet mit dem was es bekommt: Wenn Du einen Character-String
splittest, arbeitet es zeichenweise, wenn Du einen Bytestring splittest,
(natürlich) byteweise.
Also ...
> use strict;
> use warnings;
> use utf8;
> use Text::Undiacritic qw(undiacritic);
>
>
> while(){
> my $kopf="";
> my $zeichen="";
> my @satz = split(/@@@/, $_); # nur den Teil bis "@@@"
.... ist hier vermutlich $_ ein Bytestring.
Wo kommt $_ her? Es wird ein paar Zeilen vorher von ALG gelesen.
Wie wurde ALG geöffnet? Das hast Du uns nicht mitgeteilt.
hp
PS: Folgende Routine ist gelegentlich recht praktisch:
sub dumpstr {
my ($s) = @_;
print utf8::is_utf8($s) ? "char" : "byte";
print ":";
for (split //, $s) {
printf " %#02x", ord($_);
}
print "\n";
}