Schrift
[thread]12047[/thread]

ISO-8859-7 nach UCS2 wandeln



<< >> 10 Einträge, 1 Seite
mawnet
 2008-06-19 15:40
#111264 #111264
User since
2008-06-19
5 Artikel
BenutzerIn
[default_avatar]
Hallo Zusammen

Ich versuche nun seit Stunden eine Konversion von
ISO-8859-7 (Greek) nach UCS2 zu schaffen.

Beim Aufruf

test.pl?greek=&#949;

soll der Griechische Buchstaben &#949; (Epsilon) in die UCS2 Repräsentation (URL encoded) %03%B5 umgewandelt werden.
Diese wird danach erneut in UCS2 als CGI Parameter an einen Skript auf einer Webseite weitergeleitet werden.

test2.pl?NeuerParameter=%03%B5

Meine bisherigen Versuche mit

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
###########################################################################################
sub urlEncode {
my ($string) = @_;
$string =~ s/(\W)/"%" . unpack("H2", $1)/ge;
#$string# =~ tr/.//;
return $string;
}


$isogreek = $cgi->param('greek');
$utf8 = decode("iso-8859-7", $isogreek);
$ucs2 = encode("UCS-2BE", $utf8);
$URLucs2 = urlEncode($ucs2);

print $URLucs2;
###########################################################################################

gibt
%03%9e%03%85
zurück...

Hat hier jemand eine Lösung ?

Gruss
Marc


edit pq: code-tags hinzugefügt
pq
 2008-06-19 15:44
#111266 #111266
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
bitte beim nächsten mal code-tags verwenden
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
GwenDragon
 2008-06-19 16:19
#111267 #111267
User since
2005-01-17
14746 Artikel
Admin1
[Homepage]
user image
Wie willst du denn das Zeichen übergeben?
Wie bei test.pl?greek=&#949; ?

Dann brauchst du aber nicht URL-encodierte Strings sondern HTML-encodierte.

%03%9e%03%85 ist ja &#x039E0385;
mawnet
 2008-06-19 16:27
#111268 #111268
User since
2008-06-19
5 Artikel
BenutzerIn
[default_avatar]
Das Zeichen wird auf einem Griechischen PC (Zeichensatz iso-8859-7) als &#949; eingegeben und ich möchte daraus ein %03%B5 (UCS2) machen.
moritz
 2008-06-19 17:35
#111272 #111272
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
du musst einfach nur den "utf8"-string HTML-Escapen. Der wird zwar intern in utf8 gespeichert, funktioniert aber wie eine Liste der Unicode-Codepoints.
mawnet
 2008-06-19 17:31
#111273 #111273
User since
2008-06-19
5 Artikel
BenutzerIn
[default_avatar]
&#949 entspricht ja HEX 03B5...
der Skript wird aber nicht mit

test.pl?greek=&#949; aufgerufen sondern mit

test.pl?greek={Epsilon}

wo {Epsilon} das Zeichen auf der Tastatur ist.

Wie komme ich nun aber von {Epsilon} zu &#949; ?
mawnet
 2008-06-19 17:46
#111275 #111275
User since
2008-06-19
5 Artikel
BenutzerIn
[default_avatar]
OK ich habe folgendes versucht:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
use CGI;
my $cgi = new CGI;
use URI::Escape;

$isogreek               = $cgi->param('greek');
$escaped                = uri_escape( $isogreek  );

print "Content-type: text/html\n\n";
print "$escaped  <br>";


Das Resultat ist %CE%B5 und nicht wie erwartet %03%B5 (UCS2 code von EPSILON)

Irgendwie drehe ich hier im Kreis...
mawnet
 2008-06-19 18:07
#111277 #111277
User since
2008-06-19
5 Artikel
BenutzerIn
[default_avatar]
Hier die Lösung:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
use CGI;
use Encode;
use URI::Escape;

my $cgi = new CGI;

$isogreek               = $cgi->param('greek');
$isogreek               = decode_utf8($isogreek);
$ucs2                   = encode("UCS-2BE", $isogreek);
$escaped                = uri_escape($ucs2);

print "Content-type: text/html\n\n";
print "$escaped  <br>";


Scheinbar muss der Wert erst mit decode_utf8 in UTF8 umgewandelt werden.

moritz
 2008-06-19 18:19
#111278 #111278
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
...was bedeutet, dass die URL in utf8 kodiert war, nicht in iso-8859-7.
Was auch sinnvoll ist, da der Server ja nicht wissen kann, welche Kodierung der Client eingestellt hat.
murphy
 2008-06-19 18:19
#111279 #111279
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Perls interne Stringrepräsentation ist UTF-8. Daher musst Du zuerst von Entitykodierung nach UTF-8 und dann von UTF-8 nach UCS-2 konvertieren um schliesslich das Resultat als URI zu escapen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl
use 5.010;
use strict;
use warnings;

use HTML::Entities qw/decode_entities/;
use Encode qw/encode/;
use URI::Escape qw/uri_escape/;

my $input = '&#949;';
my $output = uri_escape(encode('UCS-2', decode_entities($input)));

say $output;
When C++ is your hammer, every problem looks like your thumb.
<< >> 10 Einträge, 1 Seite



View all threads created 2008-06-19 15:40.