Otrzymałem tę bazę danych zawierającą nazwiska ludzi i dane w języku francuskim, co oznacza, używając znaków takich jak é, è, ö, û itp. Około 3000 wpisów.jak wykryć i naprawić kodowanie znaków w bazie danych mysql przez php?
Wygląda na to, że dane wewnątrz zostały zakodowane czasami za pomocą utf8_encode(), a czasami nie. W rezultacie powstaje pomieszany wynik: w niektórych miejscach postacie wyglądają dobrze, w innych nie.
Najpierw próbowałem wyśledzić każde miejsce w interfejsie, w którym pojawiają się te problemy, i użyć utf8_decode() w razie potrzeby, ale naprawdę nie jest to praktyczne rozwiązanie.
Zrobiłem kilka testów i nie ma powodu, aby używać utf8_encode w pierwszej kolejności, więc wolałbym usunąć to wszystko i pracować w UTF8 wszędzie - na poziomie przeglądarki, oprogramowania pośredniego i bazy danych. Muszę więc wyczyścić bazę danych, konwertując wszystkie zminimowane dane przez jej wyczyszczoną wersję.
Pytanie: czy byłoby możliwe utworzenie funkcji w php, która sprawdzi, czy łańcuch utf8 jest poprawnie zakodowany (bez utf8_encode) czy nie (z utf8_encode), a jeśli tak, przekonwertował go z powrotem do pierwotnego stanu ?
Innymi słowy: chciałbym wiedzieć, w jaki sposób mógłbym wykryć zawartość utf8, która została utf8_encode() na zawartość utf8, która nie została utf8_encode() d.
** UPDATE: Przykład **
Oto dobry przykład: bierzesz pełną ciąg znaków specjalnych i wziąć kopię tego napisu i utf8_encode() go. Funkcja, o której marzę, przyjmuje oba ciągi, pozostawia pierwszą nietkniętą, a druga jest teraz taka sama jak ciąg pierwsza.
Próbowałem to:
$loc_fr = setlocale(LC_ALL, 'fr_BE.UTF8','[email protected]', 'fr_BE', 'fr', 'fra', 'fr_FR');
$str1= "éèöûêïà ";
$str2 = utf8_encode($str1);
function convert_charset($str) {
$charset= mb_detect_encoding($str);
if($charset=="UTF-8") {
return utf8_decode($str);
}
else {
return $str;
}
}
function correctString($str) {
echo "\nbefore: $str";
$str= convert_charset($str);
echo "\nafter: $str";
}
correctString($str1);
echo('<hr/>'."\n");
correctString($str2);
I to daje mi:
before: éèöûêïà after: �������
before: éèöûêïà after: éèöûêïà
Dzięki,
Alex
Myślę, że zrozumiałeś dokładnie ten problem i naprawdę doceniam twój szeroki wkład. Spróbuję twojego skryptu i skontaktuję się z tobą. Pytanie: gdzie mogę znaleźć kod innych akcentowanych znaków do dodania na białej liście? Jak to jest nazywane? Czy jest to kolumna kodu Hex na tej stronie: http://webdesign.about.com/od/localization/l/blhtmlcodes-fr.htm? – pixeline
Ta lista powinna obejmować większość potrzebnych danych, a jeśli potrzebujesz innych znaków, jest to oparte na kodowaniu Unicode, które możesz znaleźć w http://www.fileformat.info/info/unicode/index.htm . Znak Euro może powodować pewne problemy - jego kodowanie w standardzie Unicode to U + 20AC, ale w HTML pojawiła się konwencja, w której użyto odwołania do znaku 80, co jest używane na liście webdesign.about.com. –