web-dev-qa-db-ja.com

Facebookで投稿を共有するとUTF8無効な文字が表示される

私は自分のウェブサイトからの投稿を共有しようとしています。
問題は、投稿の説明の一部にダイヤモンドが表示されている有名な疑問符です。
すべてのOG Metaは(Yoast SEOを使用して)見栄えがよく、この 記号が付いているのは共有投稿自体の「ちょうど」テキストです。
それはおそらく、いくつかのファイルがutf-8でエンコードされていないことが原因であると理解しています。
default_charset = UTF-8ファイルに.iniを追加しましたが、変更はありません。
content-typeutf-8に正しく設定されています
w3バリデーター で妥当性検査もしましたが、関連するものは見つかりませんでした

ウェブサイトは奇妙な文字がなくても問題なく表示されます。Facebookで投稿を共有しようとしたときだけです。
間違ったエンコーディングの原因をどうやって見つけることができますか?

1
SagiLow

私は問題を見つけました。
UTF8はマルチバイト文字列を生成することがあります(たとえばヘブライ文字を使用する場合)。
Facebookは、説明を最大文字数以下に保つために投稿を共有するこの文字列を切り捨てます。
ただし、途中でマルチバイト文字が切り捨てられ、UTF8の無効な文字になる可能性があります。
この問題は実際にはすべてのマルチバイトWebサイトで再現されています。
私が見つけた唯一の回避策は、Facebookの最大文字数(コメントで約110文字、投稿で300文字)にog:descriptionを制限することです。 。

0
SagiLow

WPのインストールでは問題ないと思います。このサイトはUTF-8、あなたのフィードなどのエンコーディングとして機能します。

検証中

文字列の検証にはPHP関数 mb_check_encoding を使うべきです。データベーステーブル内のデータについてのフィードバックがあるように、小さなスクリプトでデータベーステーブル、内容をチェックします。

Libraray tchwork-grekas/utf8 も役立ちます。問題を見つけるためにも間違った文字列を修正します。

カスタムスクリプトで修正する

ただし、データベースを検索するだけの場合は、プラグインを使用して文字列を検索すると役に立ちます。代わりのものは、それらをチェックして修正するカスタムスクリプトです。 forceutf8 ライブラリが役に立つと思います。データ内にある場合は、メソッドfixUTF8で問題を解決できます。

代わりのものは最初の要約のPatchwork-UTF8ライブラリでもあります。上を見てください。

mySQLテーブル照合

すべてのテーブルの照合順序を確認してください。 SHOW TABLE STATUS の出力の照合値を調べることでそれらのエンコーディングをチェックします(phpMyAdminまたはAdminerではこれはテーブルのリストに表示されます)。

SHOW TABLE STATUS FROM <YOUR_DATABASE>

mySQL変数

各変数をチェックし、データベースでfollow mysqlコマンドを実行して、すべてがUTF-8エンコーディングを使用するように正しく設定されていることを確認することもできます。

SHOW VARIABLES LIKE 'char%';

変換する

テーブルをInnoDBとutf8mb4、postsテーブルに変換します

ALTER TABLE wp_posts ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
ALTER TABLE wp_posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

WP設定

wp-config.phpをチェックしてくださいutf8mb4はWordPress 4.2以降のあなたの選択です、完全なUTF-8サポート。

define( 'DB_CHARSET', 'utf8mb4' ); 

リンク集

3
bueltge