Question

J'écris une application Web qui requiert des URL conviviales, mais je ne sais pas comment gérer les caractères ASCII non 7 bits. Je ne veux pas non plus remplacer les caractères accentués par des entités encodées en URL. Existe-t-il une méthode C # permettant ce type de conversion ou dois-je réellement cartographier chaque cas que je souhaite traiter?

Était-ce utile?

La solution

Je ne sais pas comment le faire en C #, mais les mots magiques que vous voulez sont "décomposition Unicode". Il existe un moyen standard de décomposer les caractères composés, tels que "& # 233;", et vous devriez alors pouvoir filtrer les caractères non-ASCII.

Modifier: ceci pourrait être ce que vous êtes à la recherche de.

Autres conseils

Utilisez UTF-8:

  

Non-ASCII   les caractères doivent d'abord être codés conformément à UTF-8 [STD63], puis   chaque octet de la séquence UTF-8 correspondante doit être exprimé en pourcentage   codé pour être représenté sous forme de caractères URI.   - RFC 3986

Il existe quelque chose de similaire sur: URL Routage: gestion des espaces et des caractères illégaux lors de la création d'URL conviviales

Néanmoins, je ne recommande pas la conversion automatique. Certains mots peuvent changer de sens en faisant ce type de changement. Vous pouvez transformer un beau mot en un mot inapproprié.

Ce lien pourrait vous aider: http://www.codeproject.com/KB/ cs / UnicodeNormalization.aspx

private string LatinToAscii(string InString)
{
string newString = string.Empty, charString;
char ch;
int charsCopied;

for (int i = 0; i < InString.Length; i++)
{
    charString = InString.Substring(i, 1);
    charString = charString.Normalize(NormalizationForm.FormKD);
    // If the character doesn't decompose, leave it as-is

    if (charString.Length == 1)
        newString += charString;
    else
    {
        charsCopied = 0;
        for (int j = 0; j < charString.Length; j++)
        {
            ch = charString[j];
            // If the char is 7-bit ASCII, add

            if (ch < 128)
            {
                newString += ch;
                charsCopied++;
            }
        }
        /* If we've decomposed non-ASCII, give it back
         * in its entirety, since we only mean to decompose
         * Latin chars.
        */
        if (charsCopied == 0)
            newString += InString.Substring(i, 1);
    }
}
return newString;
}

Ok, il y a de bonnes réponses ici. Ces méthodes fonctionneraient. Cependant, je dois remettre en question votre principe de base. Je présume que ces valeurs dont vous parlez doivent être essentiellement des paramètres de chaîne de requête, non? C’est la raison la plus courante de filtrer les caractères spéciaux.

Pendant deux ou trois ans, j’ai utilisé une approche de codage / décodage de chaîne pour transmettre ce genre de choses à travers une chaîne de requête. Il y avait toujours des problèmes intermittents, parce que - sachez-le - il y a tellement de caractères spéciaux possibles, et des problèmes dans un navigateur par rapport à un autre, etc. Nos méthodes n'étaient pas aussi sophistiquées que celles décrites ici, mais néanmoins. En 2005, lors de la réécriture d'une grande partie du système sur lequel je travaillais, nous avons décidé de ne plus transmettre que les valeurs id à l'aide de la chaîne de requête. Cette approche a très bien fonctionné et je ne vois aucun inconvénient à cela. De toute façon, si vous avez une base de données, vous avez déjà un identifiant attaché à presque toutes les chaînes. S'il s'agit de recherches ou autres, vous pouvez toujours l'envoyer par le biais d'un formulaire - ou vous pouvez utiliser une solution AJAX qui ne nécessite pas de charger une autre page.

Ces méthodes ne seront pas les meilleures dans toutes les situations - il n’ya pas de solution miracle ici ni ailleurs - mais cette approche a été simple et très fonctionnelle pour moi et mon équipe, et je pense donc. c'est quelque chose que vous devriez au moins considérer.

eh bien il y a un facile pourquoi je pense, il n’ya pas beaucoup de ces caractères, vous pouvez très facilement remplacer ceux de la chaîne en utilisant la méthode Replace () de la classe string.

http: //Montréal.com

(copier / coller dans le navigateur, ça marche?)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top