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";
}