Thread Garmin-GPX - Sonderzeichen kodieren (9 answers)
Opened by Friedel at 2020-11-18 11:21

haj
 2020-11-16 15:41
#192980 #192980
User since
2015-01-07
531 Artikel
BenutzerIn

user image
2020-11-16T12:58:03 Friedel
Nicht schön aber es läuft.

Ach ja, Windows. Da hätte man draufkommen können bei Deinen Pfad-Angaben. Der Linuxer arbeitet mit einem Betriebssystem, in dem die Shell UTF-8 ans Programm liefert. Das decodiert er nicht, und das URI-Modul bekommt daraufhin die beiden Bytes ¶ anstelle des ö vorgesetzt. Die werden als "High-Byte"-Characters per Default in die entsprechenden Prozent-Escapes, also %C3 und %B6 umgesetzt (siehe CPAN:URI::Escape). Es funktioniert also... eher zufällig.

Du hast den Pfad anscheinend eher in Perl's "normaler" Codierung Wikipedia:ISO-8859-1. Da ist ein ö ein einzelnes Byte und wird nach %F6 umcodiert. Das siehst Du auch an entsprechender Stelle in Deinem fehlgeschlagenen Versuch.

Dass Du mit Deinem Code ein Ergebnis erhältst das funktioniert, ist wohl auch eher zufällig (zunächst fehlt das Semikolon nach dem ersten Statement). Denn uri_escape wandelt nicht nur den Umlaut, sondern auch alle Zeichen in %-Escapes um, die in HTTP eine spezielle Bedeutung haben - also den Doppelpunkt und den Schrägstrich. uri_escape wird also D:/Daten/ immer in D%3A%2FDaten%2F umwandeln - es sei denn, Du beschreibst für uri_escape genauer, was Du umgesetzt haben willst.

Hier mal ein vollständiges Programm für die Umsetzung. Ich habe den Pfad so geschrieben, dass er unabhängig von der Codierung der Quelldatei und dem Betriebssystem funktioniert - deswegen \x{f6} für ö und \x{e9} für é
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use 5.020;
use strict;
use warnings;
use Test::More tests => 1;

use URI::Escape;
use Encode;

my $pfad = "D:/Daten/POI/Stellplaetze/Schl\x{f6}sser-Burgen/Frankreich/Bilder/Tr\x{e9}mazan.jpg";
my $expected = 'D:/Daten/POI/Stellplaetze/Schl%C3%B6sser-Burgen/Frankreich/Bilder/Tr%C3%A9mazan.jpg';

$pfad_c = Encode::encode('utf-8', $pfad);
$pfad_g_c = uri_escape($pfad_c,"\x00-\x1f\x7f-\xff");

is($pfad_g_c,$expected,"Die Codierung ist so richtig!");

View full thread Garmin-GPX - Sonderzeichen kodieren