2010-07-21 3 views
3

Je souhaite implémenter une fonctionnalité qui insère un TAG de rupture de mot si un mot est trop long pour apparaître sur une seule ligne.Comment activer une fonction de suppression de mots par longueur sans division à l'intérieur des caractères spéciaux codés html?

protected string InstertWBRTags(string text, int interval) 
{ 
    if (String.IsNullOrEmpty(text) || interval < 1 || text.Length < interval) 
    { 
     return text; 
    } 
    int pS = 0, pE = 0, tLength = text.Length; 
    StringBuilder sb = new StringBuilder(tLength * 2); 

    while (pS < tLength) 
    { 
     pE = pS + interval; 
     if (pE > tLength) 
      sb.Append(text.Substring(pS)); 
     else 
     { 
      sb.Append(text.Substring(pS, pE - pS)); 
      sb.Append("&#8203;");//<wbr> not supported by IE 8 
     } 
     pS = pE; 
    } 
    return sb.ToString(); 
} 

Le problème est: Que puis-je faire si le texte contient des caractères spéciaux codés en html? Que puis-je faire pour empêcher l'insertion d'un tag à l'intérieur d'un &szlig;? Que puis-je faire pour compter la longueur réelle de la chaîne (qui apparaît dans le navigateur)? Une chaîne comme &#9825;&#9829; ♡ ♥ ne contient que 2 caractères (coeurs) dans le navigateur, mais sa longueur est de 14

Répondre

1

Une solution serait de décoder les entités dans les caractères Unicode qu'ils représentent et travailler avec cela. Pour ce faire use System.Net.WebUtility.HtmlDecode() if you're in .NET 4 or System.Web.HttpUtility.HtmlDecode() otherwise.

Mais sachez que tous les caractères Unicode ne correspondent pas à un char.

+0

Les méthodes 'HtmlEncode' et' HtmlDecode' ne sont pas symétriques; Le décodage convertira les entités en caractères uniques, mais le codage ne convertira pas tous ces caractères en entités. En outre, si le texte source contient des caractères tels que '<' et des entités telles que '<', il n'y a aucun moyen de distinguer ceux qui ont été décodés. –

+0

Je voulais dire qu'il ne devrait pas utiliser 'HtmlDecode' du tout. Mais cela nécessiterait que la sortie soit Unicode. – svick

+0

Cela fonctionne parfaitement. Les caractères comme

0

Vous devez passer par le caractère de texte intégral par caractère, quand vous trouvez un & que vous examinez ce qui est à côté, si vous atteignez un # il est tout à fait sûr qu'après cela jusqu'à une colonne sera un ensemble de nombre (vous pouvez le vérifier aussi). Dans une telle situation, vous déplacez votre itérateur à la position du point-virgule le plus proche et incrémentez le compteur.

En Java dialecte

int count = 0; 

     for(int i = 0; i < text.length(); i++) { 

      if(text.charAt(i) == '&') { 
       i = text.indexOf(';', i) + 1; // what, from 
      } 

      count++; 

     } 

version très simplifiée

Questions connexes