2011-08-15 6 views
10

Im faire un nettoyage des données sur certaines données en vrac qui est en cours d'importation dans mysql.Comment convertir 'u00e9' en un caractère utf8, en mysql ou php?

Les données contiennent les caractères unicode « pseudo », qui sont en fait intégrés dans les chaînes comme « u00e9 », etc.

donc un champ peut-être .. « Jalostotitlu00e1n » je dois déchirer que maladroit « u00e1n 'et le remplacer par le caractère utf correspondant

Je peux le faire soit dans mysql, en utilisant la sous-chaîne et CHR peut-être, mais Im pré-traiter les données via PHP, afin que je puisse le faire là aussi.

Je sais déjà tout sur la façon de configurer mysql et php pour travailler avec des données utf. Le problème est vraiment juste dans les données source Im Importer.

Merci

+2

Il n'y a pas chose comme "un caractère UTF-8". Peut-être que vous vouliez dire "l'encodage UTF-8 du caractère Unicode avec ce codepoint". –

+0

@Ignacio En effet, mais je définirais un "caractère UTF-8" comme "une séquence de un, deux, trois ou quatre octets qui encodent un caractère Unicode". Serait-ce une définition valide? – deceze

+1

@deceze: Techniquement, cela s'appelle une "séquence UTF-8". –

Répondre

10

Il y a un moyen. Remplacer tous uXXXX avec leur représentation HTML et faire un html_entity_decode()

I.e. Chaque caractère UTF de la forme u1234 peut être imprimé en HTML sous la forme ሴ. Mais faire un remplacement est assez difficile, car il peut y avoir beaucoup de faux positifs s'il n'y a pas d'autre char qui identifie le début d'une séquence UTF. Un regex simple pourrait être

preg_replace('/u([\da-fA-F]{4})/', '&#x\1;', $str)

+0

Merci, belle solution simple à laquelle je n'avais pas pensé. Je pense que ce sera sûr d'utiliser ceci, parce que les données que j'essaye de fixer ne devraient pas avoir n'importe quels nombres dedans dedans. La seule raison pour laquelle ils le font est en raison de l'UTF foiré, donc ceux-ci devraient être faciles à identifier – carpii

+1

Soyez prudent! Vous ne pouvez pas récupérer de façon fiable à partir d'un data mangling aussi mauvais que cela, sauf si vos données sont vraiment limitées. Prendre n'importe quelle séquence u-hex-hex-hex comme un échappement Unicode mutilé, par exemple, transformerait le mot "persuadé" en "pers 귭" ... – bobince

+0

@bobince correct, c'est pourquoi j'ai écrit ce n'est pas très facile, à cause de "faux positifs". Donc important d'avoir un identifiant. – rabudde

2

Mon script timeline twitter renvoie les caractères spéciaux comme é dans \ u00e9 donc je retirai la barre oblique inverse et utilisé @rubbude son preg_replace.

// Fix uxxxx charcoding to html 
$str  = str_replace('\u','u',$json); 
$strJSON = preg_replace('/u([\da-fA-F]{4})/', '&#x\1;', $str); 

Il workes pour moi et il se: De #Haarstichting is h\u00e9t medium voor alles en: De #Haarstichting is hét medium voor alles

+2

non! ne dépouillez pas le backslash de '\ u', car il pourrait être utilisé comme identifiant. utiliser une regex modifiée 'preg_replace ('/ \\ u ([\ da-fA-F] {4}) /', '&#x\1;', $ str)' à la place – rabudde

+0

Oui, c'est ce dont j'ai besoin. Offcourse mon décapage est faux, il dépouille le seul identifiant que j'avais. Merci @rabbude Je teste ce soir et mettra à jour cette réponse avec votre preg_replace. – Theo

+1

Droit @rabbude, maintenant je me souviens pourquoi je n'ai pas utilisé le \\ u moi-même: 'Attention: preg_replace() [fonction.preg-replace]: Échec de la compilation: PCRE ne supporte pas \ L, \ l, \ N {name}, \ U, ou \ u à offset 1' – Theo

10

/* Fonction php pour convertir UTF8 html ansi */

public static function Utf8_ansi($valor='') { 

    $utf8_ansi2 = array(
    "\u00c0" =>"À", 
    "\u00c1" =>"Á", 
    "\u00c2" =>"Â", 
    "\u00c3" =>"Ã", 
    "\u00c4" =>"Ä", 
    "\u00c5" =>"Å", 
    "\u00c6" =>"Æ", 
    "\u00c7" =>"Ç", 
    "\u00c8" =>"È", 
    "\u00c9" =>"É", 
    "\u00ca" =>"Ê", 
    "\u00cb" =>"Ë", 
    "\u00cc" =>"Ì", 
    "\u00cd" =>"Í", 
    "\u00ce" =>"Î", 
    "\u00cf" =>"Ï", 
    "\u00d1" =>"Ñ", 
    "\u00d2" =>"Ò", 
    "\u00d3" =>"Ó", 
    "\u00d4" =>"Ô", 
    "\u00d5" =>"Õ", 
    "\u00d6" =>"Ö", 
    "\u00d8" =>"Ø", 
    "\u00d9" =>"Ù", 
    "\u00da" =>"Ú", 
    "\u00db" =>"Û", 
    "\u00dc" =>"Ü", 
    "\u00dd" =>"Ý", 
    "\u00df" =>"ß", 
    "\u00e0" =>"à", 
    "\u00e1" =>"á", 
    "\u00e2" =>"â", 
    "\u00e3" =>"ã", 
    "\u00e4" =>"ä", 
    "\u00e5" =>"å", 
    "\u00e6" =>"æ", 
    "\u00e7" =>"ç", 
    "\u00e8" =>"è", 
    "\u00e9" =>"é", 
    "\u00ea" =>"ê", 
    "\u00eb" =>"ë", 
    "\u00ec" =>"ì", 
    "\u00ed" =>"í", 
    "\u00ee" =>"î", 
    "\u00ef" =>"ï", 
    "\u00f0" =>"ð", 
    "\u00f1" =>"ñ", 
    "\u00f2" =>"ò", 
    "\u00f3" =>"ó", 
    "\u00f4" =>"ô", 
    "\u00f5" =>"õ", 
    "\u00f6" =>"ö", 
    "\u00f8" =>"ø", 
    "\u00f9" =>"ù", 
    "\u00fa" =>"ú", 
    "\u00fb" =>"û", 
    "\u00fc" =>"ü", 
    "\u00fd" =>"ý", 
    "\u00ff" =>"ÿ"); 

    return strtr($valor, $utf8_ansi2);  

} 
+1

Fonction utile. Il a résolu mon problème. – pollux1er

Questions connexes