/ / Perl regex remplace par utf-8 caractères - regex, perl, utf-8, encodage de caractères, signes diacritiques

Regex Perl remplacer par des caractères utf-8 - regex, perl, utf-8, encodage des caractères, diacritiques

Je désespère d'une fonction avec laquelle j'essaie d'écrire Perl. Ma fonction est de filtrer une chaîne pour des caractères spécifiques. J'autorise des personnages comme A-Z, a-z, 0-9 et je veux aussi autoriser des umlauts allemands. Mais chaque fois que je les définit dans mon expression régulière, le remplacement échoue.

Mon encodage est utf-8 (serveur, perl, scripts).

Ceci est ma fonction:

sub cleanXSS{

my $string = shift;

$string =~ s/[^A-Za-z0-9öäü]//g;

return $string;
}

Mon script ressemble à ceci:

my $scalar = "áéíóúÁÉÍüÓÚâêÄîôßû()ÂÊÎÔÛabcäüöÄÜÖý#µzdjheäöü";
print cleanXSS($scalar)."n";

Donc, il devrait remplacer tous les caractères sauf A-Z, a-z, 0-9 et des trémas minuscules. Le remplacement des trémas allemands dans ma chaîne de test fonctionne bien, mais il semble que tous les autres caractères latins n’ont été que partiellement remplacés.

La sortie de la console ressemble à ceci:

▒▒▒▒▒▒▒▒▒ü▒▒▒▒▒▒▒▒▒▒▒▒▒▒abcäüö▒▒▒▒zdjheäöü

J'ai "essayé de nombreuses solutions comme" utiliser les paramètres régionaux ", d'autres encodages, des encodages explicites via" use Encode ", etc.

Il semble que dans un personnage comme á seul 1 des 2 octets est remplacé. Si je change mon remplaçant à ceci:

$string =~ s/[^A-Za-z0-9öäü]/_/g;

J'obtiens la sortie suivante:

▒_▒_▒_▒_▒_ö▒_▒_▒_ü▒_▒_▒_▒_▒_▒_▒_▒_▒___▒_▒_▒_▒_▒_abcäüö▒_▒_▒_▒____zdjheäöü

Comment puis-je atteindre cet objectif ?

Réponses:

6 pour la réponse № 1

Il semble que dans un caractère comme "á", seulement 1 des 2 octets soit remplacé.

  1. Décoder les entrées.

    Vous n’avez pas dit à Perl que votre script était codé avec utf-8. Ajouter

    use utf8;
    
  2. Encoder la sortie.

    Vous aurez également besoin des éléments suivants pour encoder la sortie:

    use open ":std", ":encoding(utf-8)";
    

0 pour la réponse № 2

Mettez cette ligne au début du script:

binmode STDOUT, ":encoding(utf-8)";

Voir le doc