10

PHP でいくつかの RSS フィードを作成していて、文字エンコードの問題に苦労しています。htmlentities() エンコーディングの前または後に utf8_encode() する必要がありますか? たとえば、description 要素にアンパサンドと漢字の両方が含まれていますが、どちらが適切かわかりません。

$output = utf8_encode(htmlentities($source)); or
$output = htmlentities(utf8_encode($source));

なぜ?

4

6 に答える 6

18

デフォルトは ISO-8859-1 であるため、文字セットを htmlentities 関数に渡すことが重要です。

utf8_encode(htmlentities($source,ENT_COMPAT,'utf-8'));

utf8_encode がエンティティを適切にエンコードできるように、最初に htmlentities を適用する必要があります。

(編集:コメントに基づいて順序は重要ではないという以前の意見から変更しました。このコードはテスト済みで、うまく機能します)。

于 2008-11-21T02:28:48.537 に答える
15

最初:utf8_encode関数は ISO 8859-1 から UTF-8 に変換します。したがって、入力エンコーディング/文字セットが ISO 8859-1 の場合にのみ、この関数が必要です。でも、そもそもUTF-8を使わないのはなぜですか?

2番目:必要ありませんhtmlentitieshtmlspecialchars特殊文字を文字参照に置き換えるだけです。htmlentitiesUTF-8 を使用して直接エンコードできる「多すぎる」文字を置き換えます。重要なのは、ENT_QUOTES引用スタイルを使用して一重引用符も置き換えることです。

だから私の提案:

// if your input encoding is ISO 8859-1
htmlspecialchars(utf8_encode($string), ENT_QUOTES)

// if your input encoding is UTF-8
htmlspecialchars($string, ENT_QUOTES, 'UTF-8')
于 2009-01-26T09:58:09.697 に答える
7

使用しないでくださいhtmlentities()

単純に UTF-8 文字を使用してください。フィードのエンコードを HTTP ヘッダー ( Content-Type:application/xml;charset=UTF-8) で宣言するか、それが失敗した場合は<?xml version="1.0" encoding="UTF-8"?>、最初の行で使用するフィード自体で宣言してください。

于 2008-11-26T21:39:27.807 に答える
2

htmlentities を忘れて CDATA セクションを使用する方が簡単かもしれません。これは、Firefox の RSS ビューアでエンコードされた HTML 文字をサポートしていないように見えるタイトル セクションで機能します。

<title><![CDATA[News & Updates  " > » ☂ ☺ ☹ ☃  Test!]]></title>
于 2009-01-26T07:21:31.977 に答える
1

あなたがしたい$output = htmlentities(utf8_encode($source));。これは、最初に国際文字を適切な UTF8 に変換してから、アンパサンド (場合によっては UTF-8 文字の一部も) を HTML エンティティに変換する必要があるためです。最初にエンティティを実行すると、一部の国際文字が適切に処理されない場合があります。

国際文字が utf8_encode によって変更されない場合は、それらを呼び出す順序は関係ありません。

于 2008-11-21T02:20:25.107 に答える
0

多くの試行錯誤の後、最終的に、utf8 でエンコードされたデータベース値から xml ファイルを介して html ページに文字列を適切に表示する方法を見つけました。

$output = '<![CDATA['.utf8_encode(htmlentities($string)).']]>';

これが誰かに役立つことを願っています。

于 2009-05-23T00:14:24.537 に答える