Обнаружить символы latin1 в строке utf8

Я получаю данные из базы данных в кодировке utf8. Но почему-то некоторые старые данные содержат символы latin1.

Так это

$encod = mb_detect_encoding($string, 'UTF-8', true);

всегда правильно.

Безопасно ли всегда использовать utf8_decode() для проверки символов latin1, таких как «äöüß»???

$string = utf8_decode($string);
$search = Array(" ", "ä", "ö", "ü", "ß", "."); //,"/Ä/","/Ö/","/Ü/");
$replace = Array("-", "ae", "oe", "ue", "ss", "-"); //,"Ae","Oe","Ue");
$string = str_replace($search, $replace, strtolower($string));

С уважением


person spankmaster79    schedule 24.08.2011    source источник
comment
как насчет mb_detect_encoding($string, 'ISO-8859-1,UTF-8', true); ?   -  person ajreal    schedule 24.08.2011
comment
@ajreal строка, которую я получаю из базы данных, имеет вид 'äääää' code mb_detect_encoding($this-›_name, 'ISO-8859-1,UTF-8', true);code говорит 'ISO -8859-1', а utf8_decode($string) дает 'äääää', что мне делать?   -  person spankmaster79    schedule 24.08.2011
comment
попробуйте выполнить поиск iconv, преобразование mb по php manual/SO, перед этим следует обсудить несколько вопросов   -  person ajreal    schedule 25.08.2011
comment
@ajreal хорошо, я прочитаю это, codemb_convert_encoding($this-›_name, 'ISO-8859-1');code работает для всех символов, принимающих ß, поэтому я попробую iconv сейчас   -  person spankmaster79    schedule 25.08.2011
comment
@ajreal mb_detect_encoding($string,'auto',true) работал на меня. Но основная проблема в конвертации была strtolower($string) так как не спасает конвертировать спецсимволы в меньшие с помощью этой функции   -  person spankmaster79    schedule 26.08.2011
comment
как насчет этого ? php.net/manual/en/function.mb-strtolower.php   -  person ajreal    schedule 26.08.2011
comment
@areal Сейчас я использовал mb_strtolower, и это работает   -  person spankmaster79    schedule 31.08.2011


Ответы (2)


Кажется, это работает без utf8_encoding:

<?php
   $string = "äöüß";
   $search = Array(" ", "ä", "ö", "ü", "ß", "."); //,"/Ä/","/Ö/","/Ü/");
   $replace = Array("-", "ae", "oe", "ue", "ss", "-"); //,"Ae","Oe","Ue");
   $string = str_replace($search, $replace, strtolower($string));
   echo $string;
?>

ДЕМО: http://codepad.org/HGTyHkBU

person Naftali aka Neal    schedule 24.08.2011
comment
не от меня ;-), но и не очень хороший ответ, поскольку строка, которую вы помещаете в $string, зависит от кодировки символов файла, в который вы сохраняете код. Мои данные поступают из базы данных и имеют кодировку utf8, но содержат символы latin1, такие как «Ã¤Ã¤Ã¤Ã¤Ã¤», что является utf8_decoded = äääää - person spankmaster79; 24.08.2011

Используйте htmlspecialchars(); это более безопасно для работы. Больше информации:

http://php.net/manual/en/function.htmlspecialchars.php

person Akos    schedule 24.08.2011
comment
не очень хороший ответ, так как данные не нужны для преобразования специальных символов в объекты HTML ;-) - person spankmaster79; 24.08.2011