Slugify et translittération de caractères en C #
-
24-09-2019 - |
Question
Je suis en train de traduire la méthode slugify suivante de PHP en C #: http://snipplr.com/view/22741/slugify-a- chaîne en php /
Edit: Par souci de commodité, voici le code de ci-dessus:
/**
* Modifies a string to remove al non ASCII characters and spaces.
*/
static public function slugify($text)
{
// replace non letter or digits by -
$text = preg_replace('~[^\\pL\d]+~u', '-', $text);
// trim
$text = trim($text, '-');
// transliterate
if (function_exists('iconv'))
{
$text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);
}
// lowercase
$text = strtolower($text);
// remove unwanted characters
$text = preg_replace('~[^-\w]+~', '', $text);
if (empty($text))
{
return 'n-a';
}
return $text;
}
Je suis pas probleming coder le reste, sauf que je ne trouve pas le C # équivalent de la ligne suivante de code PHP:
$text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);
Edit:
But est de traduire des caractères non-ASCII tels que Reformáció Genfi Emlékműve Előtt
dans reformacio-genfi-emlekmuve-elott
La solution
Je voudrais également ajouter que la //TRANSLIT
supprime les apostrophes et que la solution de @jxac ne répond pas. Je ne sais pas pourquoi, mais d'abord l'encoder à cyrillique, puis vous obtenez ASCII un comportement similaire à //TRANSLIT
.
var str = "éåäöíØ";
var noApostrophes = Encoding.ASCII.GetString(Encoding.GetEncoding("Cyrillic").GetBytes(str));
=> "eaaoiO"
Autres conseils
Il y a une bibliothèque .NET pour la translittération sur CodePlex - unidecode . Il fait généralement le tour en utilisant des tables Unidecode de python portés.
conversion en chaîne:
byte[] unicodeBytes = Encoding.Unicode.GetBytes(str);
byte[] asciiBytes = Encoding.Convert(Encoding.Unicode, Encoding.ASCII, unicodeBytes);
string asciiString = Encoding.ASCII.GetString(asciiBytes);
conversion en octets:
byte[] ascii = Encoding.ASCII.GetBytes(str);
@Thomas Levesque est à droite, vous obtiendrez encodée par le flux de sortie ...
pour supprimer les diacritiques (marques d'accent), vous pouvez utiliser la fonction String.Normalize, comme indiqué ici:
http://www.siao2.com/2007/05/14 /2629747.aspx
qui devrait prendre en charge la plupart des cas (où le glyphe est vraiment un caractère plus un accent). pour une mise en correspondance char encore plus agressif (pour prendre en charge des cas comme les pays scandinaves de href="http://en.wikipedia.org/wiki/%C3%98" tailladé o [Ø], digraphs et autres exotiques) glyphes, il y a l'approche de la table:
http://www.codeproject.com/KB/cs/UnicodeNormalization.aspx
comprend environ 1000 correspondances de symboles, en plus de la normalisation.
(notez, la ponctuation est supprimé par le remplacement regex dans votre exemple)