0

文字セットをlatin1からutf8に変更しようとしています

問題:フランス語の文字のパスワードが機能しません。パスワードは、特殊文字 (引用符、括弧、ドル記号など) に対して機能します。コード部分の文字セットを latin1 に戻すと、フランス語の文字を使用してログインできますが、utf8 ではログインできません。

私はこれまでに何をしましたか:

  • データベースの文字セットを変更しました。すべての列タイプが utf8 として表示されていることがわかります。データベース レベルとテーブル レベルの両方でクエリを実行しました。
  • コード部分の文字セットをutf8に変更。
  • 私のテストでは、すべてがクールで、アクセント付きのフランス語の文字が正しく表示され、壊れているようには見えません。問題を引き起こしているのはパスワードのみです。

提案してください:

  • データ自体もutf8に変更する必要がありますか?
  • alter table コマンドを実行したところ、列の文字セットが utf8 に変更されました。

コード部分をlatin1に変換するとパスワードが正常に機能するため、これが原因であると思われます。したがって、コードとデータベースはlatin1だったので特殊文字を認識できると考えていますが、utf8に変更すると、最初にlatin1として保存されていたため、特殊なフランス語文字を解釈できません。

PHP と MySQL のバージョンはどちらも最新です。

私の回答は長かったので、ここに追加することにしました。

ハッシュ関数は非常に複雑で、md5、encode64、および crypt 関数の組み合わせを使用しています。結果の pwd がラテン語とユニコードで異なることに気付きました。それが理由です。以前に latin1 を使用して生成された pwd は、変換後の unicode ではなく、pwd と一致するのではないかと疑っていました。繰り返しますが、これはフランス語の文字でのみ発生し、0 から 127 の ascii 範囲では発生しません。文字セットを unicode-8 に変更して、既存のユーザーが正常にログインできるこの状況を処理する方法がわかりません。パスワードが latin1 と unicode8 のどちらを使用して作成されたかを区別する方法がないため、iconv() を使用できません。データベースの変更に加えて、データも変更する必要がありますか? また、その方法は? 私の考えが正しければ、Unicode8 へのデータ変換でフランス語の文字も処理されるのでしょうか?

4

1 に答える 1

-1

char をある Unicode から別の Unicode に変換する必要がある場合は、この関数を使用できます

iconv()
于 2013-11-22T22:54:13.423 に答える