データを保存するための奇妙な文字エンコーディング、古いスクリプトでは正常に表示されるが、新しいスクリプトでは正常に表示されない
P粉141455512
P粉141455512 2024-01-10 16:51:57
0
2
309

古い Web サイトを書き直そうとしています。

ペルシア語で書かれており、ペルシア語/アラビア文字が使用されています。

リーリー

ほぼすべてのテーブル/列の COLLATE が utf8_persian_ci

に設定されています

新しいスクリプトに codeigniter を使用しています。

リーリー

はデータベース設定にあるので問題ありません。

これが奇妙な部分です

古いスクリプトは、TUBADBENGINE または TUBA DB ENGINE と呼ばれる何らかのデータベース エンジンを使用していました...特別なことは何もありません。

古いスクリプトを使用してデータベースにデータ (ペルシャ語) を入力したとき、データベースを見ると、文字は Ø1مران として保存されていました。

古いスクリプトはデータを正常に取得/表示しますが、新しいスクリプトはデータベースと同じ奇妙なフォント/文字セットを使用してデータを表示します

したがって、「rather」と入力すると、データベースに保存されているデータは Ø1مرا٠のようになり、それを新しいスクリプトで取得すると、See が表示されます。 Ø1مرا٠ですが、古いスクリプトでは ??????

と表示されます。 リーリー

一方、??? をデータベースに直接入力すると

もちろん、同じものをデータベースに保存しました むしろ

新しいスクリプトは非常にうまく表示されます

しかし、古いスクリプトでは ? ? ?

これを理解できる人はいますか?

これは大型エンジンです

https://github.com/maxxir/mz-codeigniter-crud/blob/master/tuba.php

古いスクリプトの使用例:

ああああ

P粉141455512
P粉141455512

全員に返信(2)
P粉295616170

deceze の答え は非常に優れていますが、手動でテストせずに大量のレコードを処理するのに役立つ可能性のある情報をいくつか追加できます。

変換

CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8) が失敗した場合、field_name の内容の代わりに NULL が出力されます。

そこで、これらのレコードを見つけるためにこれを使用します:

リーリー

またはこれ:

リーリー この句を含む

UPDATE は、正常に変換されたレコードにのみ影響します: リーリー

いいねを押す +0
P粉920835423

つまり、この質問はこれまでに何千回も議論されてきたからです:

  1. PHP は、"汉字" などの文字列を UTF-8 でエンコードして保存します。バイトは E6 BC A2 E5 AD 97 です。
  2. この文字列は、latin1 に設定された データベース接続を介して送信されます。
  3. データベースはバイト E6 BC A2 E5 AD 97 を受信し、それらが latin1 文字を表していると考えました。
  4. データベース格納文字 æ¡ ¡ ¿李>
  5. 同じプロセスを逆に実行すると、PHP は同じバイトを受信し、それらを UTF-8 として扱います。ラウンドトリップは PHP では問題なく機能しますが、データベースは文字を適切に処理しません。

つまり、ここでの問題は、データをデータベースに入力するときにデータベース接続が正しく設定されていないことです。データベース内のデータを正しい文字に変換する必要があります。これを試して:### リーリー

おそらく

utf8 は必要なものではないので、試してみてください。機能する場合は、これを UPDATE ステートメントに変更して、データを永続的に更新します。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!