25

テキストエリアのあるフォームがあります。ユーザーは、データベースに保存されているテキスト ブロックを入力します。

ユーザーは、スマート クォーテーションやエムダッシュを含むテキストを Word から貼り付けることがあります。これらの文字は、データベースでは「、」、「、、」として表示されます。</p>

スマート クォートを通常のクォートに変換し、emdash を通常のダッシュに変換するには、入力文字列に対してどの関数を呼び出す必要がありますか?

私はPHPで働いています。

更新: これまでに素晴らしい回答をありがとうございました。エンコードに関する Joel のサイトのページは非常に有益です: http://www.joelonsoftware.com/articles/Unicode.html

私の環境に関するいくつかのメモ:

MySQL データベースは UTF-8 エンコーディングを使用しています。同様に、コンテンツを表示する HTML ページは、メタ コンテンツ タイプを明示的に設定することにより、UTF-8 (Update:) を使用しています。

これらのページでは、スマート クォートと em ダッシュがクエスチョン マーク付きのひし形で表示されます。

解決:

返信ありがとうございます。解決策は次の 2 つでした。

  1. データベースと HTML ファイルが明示的に UTF-8 エンコーディングを使用するように設定されていることを確認してください。
  2. htmlspecialchars()の代わりに 使用しhtmlentities()ます。
4

13 に答える 13

15

これは Unicode の問題のようです。Joel Spolsky は、このトピックについて良い出発点を持っています: http://www.joelonsoftware.com/articles/Unicode.html

于 2008-10-06T19:24:28.100 に答える
9

mysql データベースは UTF-8 エンコーディングを使用しています。同様に、コンテンツを表示する html ページは UTF-8 を使用しています。

HTML のコンテンツは UTF-8 で構いませんが、(PHP で生成された) HTML ページのコンテンツ タイプ (エンコーディング) も明示的に UTF-8 に設定していますか? Content-TypeHTML のヘッダーを返すか、HTML にタグを"text/html;charset=utf-8"追加してみてください。<meta>

<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>

そうすれば、PHP に送信されるデータのコンテンツ タイプも同じになります。

同様の問題があり、<meta>タグを追加するとうまくいきました。

于 2008-10-07T16:02:19.397 に答える
4

本当の問題は、データベースがページと同じ文字エンコード(おそらくUTF-8であるはずです)を使用していないことのようです。その場合、ユーザーが非ASCII文字を送信すると、データベースに奇妙な文字が表示される可能性があります。それらのいくつか(中引用符と全角ダッシュ)を見つけて修正しても、実際の問題は解決されません。

少なくともMySQLデータベースの場合、データベースを別の文字エンコードに移行するための情報を以下に示します。

于 2008-10-06T19:30:16.810 に答える
2

残念なことに、これは非常に一般的な問題であり、PHP の文字セットの扱いが非常に貧弱であるため、解決にはなりません。

私たちがしているのは、テキストを強制的に通すことですiconv

// Convert input data to UTF8, ignore any odd (MS Word..) chars
// that don't translate
$input = iconv("ISO-8859-1","UTF-8//IGNORE",$input);

フラグは、//IGNORE翻訳できないものはすべて破棄されることを意味します。

文字列 //IGNORE を追加すると、対象の文字セットで表現できない文字は黙って破棄されます。

于 2008-10-06T19:39:49.957 に答える
1

そのために、標準の文字列置換関数をよく使用します。そのコンテキストでのASCII/Unicodeの性質はかなり曖昧ですが、機能します。PHPファイルが正しいエンコード形式などで保存されていることを確認してください。

于 2008-10-06T19:28:59.027 に答える
1

私の経験では、スマートクォートを受け入れて、どこでも同じエンコーディングを使用していることを確認する方が簡単です。まず、これをフォームタグに追加します。accept-charset="utf-8"

于 2008-10-06T19:31:55.980 に答える
1

ISO-8859-1からUTF-8へのmb_convert_encodingを試すことができます。

$str = mb_convert_encoding($str, 'UTF-8', 'ISO-8859-1');

これは、UTF-8が必要であり、convertが妥当な置換を見つけることができることを前提としています...そうでない場合は、mb_str_replaceまたはpreg_replaceを自分で使用してください。

于 2008-10-06T19:32:21.110 に答える
1

個々の列の照合を手動で UTF8 に変更する必要があります。データベース全体を変更しても、これらは変更されません。

于 2011-10-10T15:24:52.167 に答える
1

データベース接続が、クライアントとの間で UTF-8 を受け入れて提供するように構成されていることを確認する必要があります (そうしないと、通常は latin1 である「デフォルト」に変換されます)。

実際には、これはクエリ SET NAMES 'utf8'; を実行することを意味します。

http://www.phpwact.org/php/i18n/utf-8/mysql

また、スマート クォートは iso-8859-1 (latin-1) ではなく、windows-1252 文字セットの一部です。あなたの問題とはあまり関係ありませんが、参考までに。ユーロ記号もそこにあります。

于 2008-10-07T17:18:05.483 に答える
1

問題は mysql 文字セットにあります。このコード行で問題を修正しました。

mysql_set_charset('utf8',$link); 
于 2010-10-24T17:20:19.867 に答える
1
于 2014-10-16T04:48:58.230 に答える
1

これは最善の解決策ではないかもしれませんが、PHP が何を認識するかをテストしてみます。「-」が表示されたとしましょう (単純な「"」や「“」など、他にもいくつかの可能性があります)。次に、データベースに回答を詰め込む前に、str_replace を実行してそれらをすべて取り除き、通常の引用符に置き換えます。

人々が他の回答で助けようとしているように、より良い解決策はおそらくエンドツーエンドのデータをすべてUTF-8に渡すことです。

于 2008-10-07T16:18:54.730 に答える