2010-05-27 4 views
0

Récemment, nous avons eu un problème d'encodage dans notre système:réparer le mauvais caractère en raison de problème d'encodage

Si nous avions la chaîne « æ » dans notre db, il est devenu « Ã| » sur nos pages web.

Maintenant ce problème est résolu, mais le problème est que maintenant nous avons beaucoup de "Ã|" dans notre base de données: les utilisateurs n'ont pas vu et valider le formulaire pré-rempli avec ces caractères.

J'ai trouvé que si vous lisez en utf 8 C3A6 vous obtiendrez "æ", si vous le lisez en ascii vous obtiendrez "Ã|".

Il est étrange parce que si j'exécuter

"select convert(varbinary(40),N'æ'),convert(varbinary(40),'æ')" 

Je n'ai pas le même résultat ...

Avez-vous une idée sur la façon dont je peux réparer ma base de données (par exemple changer tout « Ã | "À" æ ")?

thx

Répondre

1

Pour autant que je sache, le seul moyen de résoudre consiste à utiliser Remplacer:

Update Table 
Set Column = Replace(Column, N'æ', N'æ') 

Dans ce cas, je suppose que la colonne est maintenant Unicode (c.-à-nvarchar ou nchar).

+0

Je sais comment faire un remplacement, ici je veux traiter avec chaque caractère étrange: "ó" est devenu "³". J'aimerais faire quelque chose qui gérera tous les cas (comme je l'ai dit dans mon post, il y a un lien logique entre le personnage attendu et le mauvais, donc il doit y avoir un moyen de revenir en arrière). –

+0

@remi bourgarel - C'est mon point. Il n'y a pas d'autre solution miracle que de corriger manuellement les données grâce à une série d'appels à Remplacer. Vous n'obtiendrez pas de correspondance 1: 1 car, dans certains cas, Unicode peut avoir encodé votre texte en deux caractères au lieu d'un caractère. – Thomas

+0

comme Thomas a dit qu'il n'y a pas de balle d'argent ici ... dommage –

0

Si vous le lisez en ASCII, vous obtiendrez "Ã|".

L'ASCII affecte uniquement des caractères aux octets 00-7F. Il existe cependant plusieurs codages "ASCII étendus" dans lesquels C3 A6 représente "Ã|", y compris les encodages populaires d'Europe occidentale ISO-8859-1 et Windows-1252, et les ISO-8859-9 et Windows-1254 turcs.

Pour résoudre votre problème d'encodage, simplement:

  1. Encode la chaîne à un tableau d'octets en utilisant la page de code 1252 (ou 1254 pour le turc). Cela devrait produire les octets UTF-8.
  2. Décode le tableau d'octets en chaîne à l'aide de UTF-8.
+0

Avez-vous une idée si je peux le faire avec sql? –

Questions connexes