В такой ситуации я обычно начинаю со строки, вставленной из слова:
$str = 'Danâ’s back !';
var_dump($str);
И, переходя побитно в нем, я вывожу шестнадцатеричный код каждого байта:
for ($i=0 ; $i<strlen($str) ; $i++) {
$byte = $str[$i];
$char = ord($byte);
printf('%s:0x%02x ', $byte, $char);
}
Который дает такой вывод:
D:0x44 a:0x61 n:0x6e �:0xc3 �:0xa2 �:0xe2 �:0x80 �:0x99 s:0x73 :0x20 b:0x62 a:0x61 c:0x63 k:0x6b :0x20 !:0x21
Затем, с небольшим количеством предположений, удачи и проб и ошибок, вы обнаружите, что:
â
- это символ, который умещается в два байта: 0xc3 0xa2
- и специальная кавычка - это символ, который умещается в три байта:
0xe2 0x80 0x99
Подсказка: легче, когда нет двух специальных символов, следующих друг за другом; -)
После этого нужно просто использовать str_replace для замены правильной последовательности байтов другим символом; например, заменить специальную кавычку обычной:
var_dump(str_replace("\xe2\x80\x99", "'", $str));
Даст вам:
string 'Danâ's back !' (length=14)