Ваш mojibake из-за множественных неправильных кодировок между UTF8 и cp1252, который является ужасной версией Windows 8859-1.Если вы примените ту же самую неправильную кодировку в обратном порядке, вы можете в большинстве случаев не повредить ваши данные, если вам повезет.
$in = 'Ü'; // this is copied from StackOverflow where it is UTF8 encoded which
// may or may not match the actual encoding you pasted in.
$p1 = iconv('utf-8', 'cp1252', $in);
$p2 = iconv('utf-8', 'cp1252', $p1);
var_dump(
$in, bin2hex($in),
$p1, bin2hex($p1),
$p2, bin2hex($p2)
);
Вывод:
string(4) "Ü"
string(8) "c383c593"
string(2) "Ü"
string(4) "c39c"
string(1) "�"
string(2) "dc"
И если вы посмотритевверх по таблице кодирования cp1252 вы увидите, что 0xDC равно Ü
.
Но, честно говоря, вы должны:
- Исправить эти поврежденные данные в источнике.
- Просто стандартизируйте UTF8 , если можете.
Один или оба из них сделают вашу жизнь проще.
Редактировать: Отключено mb_
для iconv
для соответствия с вопросом.mb_
эквивалент:
$in = 'Ü';
$p1 = mb_convert_encoding($in, 'cp1252', 'utf-8');
$p2 = mb_convert_encoding($p1, 'cp1252', 'utf-8');