9

utf8_decode() の動作について混乱しており、少し説明が必要です。大丈夫だと思います。

テキストをキャプチャして MySQL データベースに保存するために使用している単純な HTML フォームを次に示します (これは utf8_general_ci 照合順序を使用します)。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<form action="update.php" method="post" accept-charset="utf-8"> 
<p> 
    Title: <input type="text" name="title" id="title" accept-charset="utf-8" size="75" value="" /> 
</p> 
<p> 
    <input type="submit" name="submit" value="Submit" /> 
</p> 
</form>
</body>
</html>

ご覧のとおり、適切な場所で charset=utf8 を使用してこれをコーディングしました。分音符号 (例: ñ、ó など) を含むテキストを受け入れます。最後に、すべてのテキスト入力に対して小さなスクリプトを実行して分音記号をチェックし、それらを HTML エンティティに変更します (例: ñ は ñ になります)。

スクリプトが入力を受け取ると、最初に utf8_decode($input) を実行し、次に小さなスクリプトを実行して分音記号をチェックし、必要に応じて変更する必要があります。すべて正常に動作します。この入力でデコードを実行する必要がある理由が気になります。utf8_decode は、UTF-8 でエンコードされた文字列を ISO-8859-1 に変換することを理解しています。すべてが正常に機能している (またはそう思っている) 場合でも、後で追いつくような厄介なことをしていないことを確認したいと思います。たとえば、UTF-8 文字を保存/提供するように設定されているデータベースに保存するために、ISO-8859-1 でエンコードされた文字を送信しています。分音記号からエンティティへのスクリプトが返す文字列に対して utf8_encode() を実行するようなことをする必要がありますか? 例えば:

$string = utf8_decode($string);
$search = explode(",","À,È,Ì,Ò,Ù,à,è,ì,ò,ù,Á,É,Í,Ó,Ú,Ý,á,é,í,ó,ú,ý,Â,Ê,Î,Ô,Û,â,ê,î,ô,û,Ã,Ñ,Õ,ã,ñ,õ,Ä,Ë,Ï,Ö,Ü,Ÿ,ä,ë,ï,ö,ü,ÿ,Å,å,Æ,æ,ß,Þ,þ,ç,Ç,Œ,œ,Ð,ð,Ø,ø,§,Š,š,µ,¢,£,¥,€,¤,ƒ,¡,¿");
$replace = explode(",","&Agrave;,&Egrave;,&Igrave;,&Ograve;,&Ugrave;,&agrave;,&egrave;,&igrave;,&ograve;,&ugrave;,&Aacute;,&Eacute;,&Iacute;,&Oacute;,&Uacute;,&Yacute;,&aacute;,&eacute;,&iacute;,&oacute;,&uacute;,&yacute;,&Acirc;,&Ecirc;,&Icirc;,&Ocirc;,&Ucirc;,&acirc;,&ecirc;,&icirc;,&ocirc;,&ucirc;,&Atilde;,Ntilde;,&Otilde;,&atilde;,&ntilde;,&otilde;,&Auml;,&Euml;,&Iuml;,&Ouml;,&Uuml;,&Yuml;,&auml;,&euml;,&iuml;,&ouml;,&uuml;,&yuml;,&Aring;,&aring;,&AElig;,&aelig;,&szlig;,&THORN;,&thorn;,&ccedil;,&Ccedil;,&OElig;,&oelig;,&ETH;,&eth;,&Oslash;,&oslash;,&sect;,&Scaron;,&scaron;,&micro;&cent;,&pound;,&yen;,&euro;,&curren;,&fnof;,&iexcl;,&iquest;");
$new_input = str_replace($search, $replace, $string);
return utf8_encode($new_input); // right now i just return $new_input.

これについて誰かが提供しなければならない洞察に感謝します。

4

3 に答える 3

1

「accept-charset」は使用しないでください。壊れてます。ほとんどのブラウザーは、独自の http 要求での送信を停止しています。一部のブラウザー (IE) は、フォームを解析するときにこの属性を完全に無視しますが、他のブラウザー (IE) は非常に限定された処理を行います。実際には、「accept-charset」は良いことよりも悪いことをします。

規則では、ブラウザはフォームを受信したときと同じエンコーディングでデータを送信します。そのため、ページが UTF-8 として送信されていることを確認してください。HTML の head 内のメタ タグだけでは十分ではありません。PHP ページの場合、この設定は 3 つの場所で設定できます。

  • <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />「head」内のHTML タグ。
  • Apache 構成のAddDefautCharset UTF8行 (または他の Web サーバーの同様のもの)。
  • への PHP 呼び出しheader("Content-type=text/html; charset=utf-8");(ページに何かが表示される前)。

各ディレクティブは前のディレクティブをオーバーライドします。したがって、サーバーがすでに文字セットを宣言している場合、メタ タグは無視されます。

したがって、次のことを行う必要があります。

  • もちろん、ソース ファイルが UTF-8 であることを確認してください。
  • W3C で検証されるように HTML ソースを修正します。たとえば、メタ タグは XHTML で閉じる必要があります。
  • 「accept-charset」属性を削除します。
  • 最終的には、Apache または PHP のheader().
  • ブラウザーで、サーバーから受信した HTTP ヘッダーに正しいエンコーディングが宣言されていることを確認します (メタ タグに依存している場合はエンコーディングなし)。Linuxcurl -I <URL>では、HTTP ヘッダーのみが表示されます。
于 2012-03-25T15:48:23.227 に答える
0

utf-8で表示するテキストを表示するページを取得しますが、accept-charset="utf-8"を使用してutf8に切り替えても、サーバーはそれをiso-8859-1にコンサートし、表示されるとその後、iso-8859-1 から再び utf-8 に変換しますが、utf-8 のみの文字を変換できたため、変な文字が表示され、このプロセスをループするたびに悪化します。私が見つけたのは、html側ですべてを行っても、サーバー上でutf-8を読み取るように切り替える方法がないため、すべてをutf-8に切り替えることはできないということです。それはApache上にあり、知りたい方法があれば。

于 2012-03-22T20:14:27.350 に答える
0

accept-charset="utf-8" でフォームを送信すると、ブラウザーはフォーム データを utf-8 でエンコードされた ISO-8859-1 文字でサーバーに送信します。utf8_decode は、エンコードされたデータを厳密な ISO-8859-1 に変換します。たとえば、"ñ" を送信すると、utf-8 エンコーディングは "%F1" をフォーム アクションに送信します。スクリプトを機能させるには、これを "ñ" に戻す必要があります。

于 2012-03-22T19:22:18.780 に答える