PHP-转换不正确的变音符号(utf8)

时间:2018-12-14 23:24:56

标签: php utf-8 iso-8859-1 iconv

如何转换不正确的Umlauts,例如:

ListDatabaseTables

那是我当前的代码,但是它不起作用:

 ä <- ä
 Ä <- Ä
 ö <- ö
 Ö <- Ö
 ü <- ü
 Ü <- Ãœ
 ß <- ß
…

2 个答案:

答案 0 :(得分:2)

尝试一下。它输出:äÄöÖüÜß

<?php

$inputs = [ 'ä', 'Ä', 'ö', 'Ö', 'ü', 'Ü', 'ß' ];

foreach ($inputs as $input)
{
    echo iconv('UTF-8', 'WINDOWS-1252//TRANSLIT', $input);
}

答案 1 :(得分:0)

您的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 encoding table,将会看到0xDC是Ü

但老实说,您应该:

  1. 在源头修复此损坏的数据。
  2. Just standardize on UTF8(如果可以)。

这些之一或两者都会使您的生活更轻松。

编辑:出于问题的一致性,将mb_的{​​{1}}切换为iconv。相当于mb_是:

$in = 'Ü';
$p1 = mb_convert_encoding($in, 'cp1252', 'utf-8');
$p2 = mb_convert_encoding($p1, 'cp1252', 'utf-8');