0

文字列MühleをMühleとしてutf8データベースに保存しています。utf8も使用している私のWebページに正しく表示されるように、UTF8で表示したいと思います。

文字列をデータベースに書き込む前にutf8に変換されていなかったため、Webページに正しく表示されなくなったと思います。

mysqlデータベースからこの文字列を選択してutf8に変換しようとしましたが、機能しませんでした。また、何度もデコードしてみましたが、うまくいきませんでした。以下のコードを参照してください。

$string = Mühle;
$string=utf8_encode($string);
echo $string;

$string = Mühle;
$string=utf8_decode($string);
$string=utf8_encode($string);
echo $string;

上記のコードの出力は、どちらの場合も入力と同じであり、文字列については何も変更されていません。

この文字列をmysqlデータベースで更新できるように変換し、次に選択したときにMühleとして正しく表示されるようにするにはどうすればよいですか?

4

2 に答える 2

2

文字列は二重にエンコードされたUTF-8です。つまり、ラテン語-1として解釈されてからUTF-8に再エンコードされたUTF-8です。

これは、文字エンコードを台無しにした場合に発生する可能性があります。たとえば、MySQLがLatin-1を使用する接続を期待しているときにUTF-8データを送信した場合です。これを修正するには、接続を作成したらすぐにmysqli_set_charset(またはデータベースAPIの同等の関数)を呼び出すか、デフォルトでUTF-8接続を使用するようにMySQL構成を変更する必要があります。

さらに、データを修正する必要があります。これは、utf8_decodeを適切な回数使用して行われます。「Mühle」がUTF-8接続でデータベースから返される正確なバイトである場合は、その文字列を読み取り、utf8_decodeを介して送信してから、その行を更新する必要があります(UTF-8接続を引き続き使用)。

MySQLで行を選択すると、クライアントに返送される前に、テーブルの文字セットから接続の文字セットに変換されることに注意してください。したがって、画面に「Mühle」が表示されている場合、MySQLはUTF-8接続を使用しており文字列をUTF-8として表示している場合、修正するにはutf8_decodeを2回呼び出す必要があります。文字列は実際にはトリプルエンコードされています-データベーステキストで2回、表示用に1回です。すべてを再確認します。できればphpMyAdminなどの十分に開発されたMySQLクライアントを使用して、正しく表示されるまで、データが正しくエンコードされないようにします。

これが数行の問題である場合は、手動で修正しても問題ありません。データベースの一般的な問題である場合は、SQLスクリプトをダンプし、そのファイルを変換して、それを使用して古いデータを置き換えることをお勧めします。

于 2012-08-16T19:40:12.547 に答える
0

次の機能を試してください。文字列をUTF-8に変換し直します。

function convert_smart_quotes($string)
{
$string = htmlentities($string);
$string = mb_convert_encoding($string, 'HTML-ENTITIES', 'utf-8');
$string = htmlspecialchars_decode(utf8_decode(htmlentities($string, ENT_COMPAT, 'utf-8', false)));

$s = array(
    chr(145) => "'",
    chr(146) => "'",
    chr(147) => '"',
    chr(148) => '"',
    chr(151) => '-',
    's©' => '©',
    '®' => '®',
    '™' => '™', //™
    '“' => '"', // left side double smart quote
    'â€' => '"', // right side double smart quote
    '‘' => "'", // left side single smart quote
    '’' => "'", // right side single smart quote
    '…' => '...', // elipsis
    '—' => '-', // em dash
    '–' => '-', // en dash
);

return strtr($string, $s);
}
于 2013-04-05T16:09:42.000 に答える