2015-07-21 2 views
1

J'ai une rangée varchar mysql (50) dans le classement cp1251_general_ci. Après mysql_fetch_row en php, j'ai une chaîne $. Puis-je faire ce qui suit:de MySQL classement cp1251_general_ci (Windows 1251) en UTF-8 php

echo mb_detect_encoding($string,'CP1251,UTF-8,Windows-1251'); // echoes Windows-1251 
$string = mb_convert_encoding($string, 'UTF-8', 'Windows-1251'); 
echo mb_detect_encoding($string,'CP1251,UTF-8,Windows-1251'); // again echoes Windows-1251 

Pourquoi la deuxième fois la chaîne n'est pas UTF-8?

J'ai aussi essayé

$string = iconv('Windows-1251', 'UTF-8', $string); 

Mais encore une fois le charset est sur Windows 1251.

Et dans le résultat final, je me suis cassé le codage dans mon nom de fichier qui se compose de la variable $ string.

Comment puis-je convertir le classement mysql cp1251_general_ci (Windows 1251) en UTF-8?

post-scriptum

echo $string; \\ echoes ������ 
echo bin2hex($string); \\ echoes cce5e3e0f4eeed 
$string = mb_convert_encoding($string, 'UTF-8', 'Windows-1251'); 
echo $string; \\ echoes Мегафон 
echo bin2hex($string); \\ echoes d09cd0b5d0b3d0b0d184d0bed0bd 

Mais

fopen("../tmp/$string.log", "w"); 

crée un fichier .../tmp/?????????????? journal. (Sous Linux)

+0

Quel est exactement le contenu de la chaîne? Quelle est sa valeur hexadécimale ('echo bin2hex ($ string)')? – deceze

+0

J'ai mis à jour ma question après votre commentaire – cofirazak

Répondre

0

Trouvé le raison de cette situation étrange!

En bref mots: si vous voyez une bonne chaîne UTF-8 codé sur un serveur (dans le terminal) dans des symboles illisibles - vérifier les paramètres régionaux du serveur. Et si vous voyez un comportement étrange de la méthode mb_detect_encoding(), n'oubliez pas que - mb_detect_encoding ne vous donne pas une détermination précise de l'encodage d'une chaîne.

La raison de l'encodage incorrect dans le nom de fichier:. .../tmp/?????????????? fichier journal est le lieu sur le serveur! Voici le résultat de la commande locale sur le serveur où se trouve le fichier:

$ locale 
LANG= 
LC_CTYPE="C" 
LC_COLLATE="C" 
LC_TIME="C" 
LC_NUMERIC="C" 
LC_MONETARY="C" 
LC_MESSAGES="C" 
LC_ALL= 

Pour corriger l'affichage UFT-8 symboles dans les noms de fichiers sur le serveur les paramètres régionaux du serveur doit être utf-8 aussi.

Et à propos de toutes les conversions dans la question. Les deux méthodes:

iconv('Windows-1251', 'UTF-8', $string); 

et

mb_convert_encoding($string, 'UTF-8', 'Windows-1251'); 

fonctionne très bien dans ce cas.

La seule question est pourquoi le deuxième écho de

echo mb_detect_encoding($string,'CP1251,UTF-8,Windows-1251'); // echoes Windows-1251 
$string = mb_convert_encoding($string, 'UTF-8', 'Windows-1251'); 
echo mb_detect_encoding($string,'CP1251,UTF-8,Windows-1251'); // again echoes Windows-1251 

n'est pas UTF-8?

Et la réponse est - mb_detect_encoding ne vous donne pas une détermination de codage précise d'une chaîne