0

何時間も検索しました!!! 答えを求めて。私が見つけたものはすべて、私が望んでいることをしていません。

私たちのクライアントは、HTML Webサイトの一部をTinyMCEwysiwygエディターにコピーし、プレーンテキストのテキストエリアまたは入力フィールド(タイトル用)にコピーすることを好みます。問題は、wysiwyg文字がHTMLであり、RAWhtmlではないことです。

これがほんの一例です。このエラーをスローする可能性のあるすべての文字に対応したいことを覚えておいてください。

コンパニオンデュアルマッサージ–バスタブでの2シートウォーク

真ん中のそのDASHはのhtmlエンティティを持っています–

HTMLを直接コピーして、プレーンテキストの入力フィールドまたはテキストエリアに貼り付けると、エラーがスローされます

「UTF8」をエンコードするための無効なバイトシーケンス:0x96

UTF8データベースに送信しようとしたとき。

クライアントが商標、著作権、または予約済みの記号をコピーする可能性があります。

私はそれらを取り除くだけではありません。それらを変換したい。

私はあらゆる種類のコンバーターを試しました。行ったことのあるすべてのサイトをリストしたくありません。

何か案は?

最悪の場合、私はそれらの4文字だけを取り、それらを何にでも変換します。

4

2 に答える 2

0

これを試して。「古い」データをUtf-8に変換するのは少し手間がかかります。「古い」とは、古いデータベースから取得したデータを意味します。これは、UTF-8またはラテン語で、エスケープ文字または非エスケープ文字のいずれかです。結果は常に、元の文字(エンティティではない)を含むUtf-8文字列になります。

/**
 * Decodes HTML entities and converts the string to UTF-8 if it isn't UTF-8 already.
 * @param string $string LATIN-1 or UTF-8 string that may contain html_encoded characters.
 * @returns string
*/
private function tidyUtf8($string)
{
  // Check if the string contains any Latin characters that are not valid UTF-8.
  $utfCheckString = @iconv(
       'UTF-8',
       'UTF-8//IGNORE',
       $string
  );
  $isUtf = ($string === $utfCheckString);

  // If the string is not UTF-8, convert it to UTF-8
  if ($isUtf === false)
  {
       // Decode HTML entities to prevent double encoding later. 
       // Decode only the ones that are valid LATIN-1 characters.
       $string = html_entity_decode($string, ENT_QUOTES, 'ISO-8859-1');
       $string = iconv('ISO-8859-1', 'UTF-8', $string);
  }

  // Decode all HTML entities to prevent double encoding later. 
  // Include UTF-8 characters.
  $string = html_entity_decode($string, ENT_QUOTES, 'UTF-8');

  return $string;
}

この関数は、UTF-8およびLATIN-1(ISO-8859-1)を受け入れることを目的としています。後者は必要ないかもしれないので、この関数の一部を取り除いて、次のように使用することができます。

html_entity_decode($string, ENT_QUOTES, 'UTF-8');
于 2012-11-26T22:43:08.127 に答える
0

これはエンコーディングの問題であり、HTMLエンティティの問題ではありません。HTMLからテキストボックスにデータをコピーすると、ブラウザはのよう–にエンティティに貼り付けられず、実際の文字に貼り付けられます。取得している文字はWindows-1252(誤ってISO-8859-1と呼ばれることもあります)でエンコードされているようです。データベースはUTF-8を想定しているため、この文字を処理できません。

これが発生する可能性がある理由はいくつか考えられます。使用しているブラウザ、言語、Webフレームワーク、またはデータベースをリストしていなかったので、いくつか提案します。そのうちの1つが機能することを願っています。一般に、すべての段階でエンコーディングにUTF-8を使用するのが最善です。ただし、それが不可能な場合は、すべてのレベルで一貫したエンコーディングを使用するか、変換する必要があります。

データベースはUTF-8を使用しているので、それが使用したいエンコーディングであると想定します。チェックすることの1つは、ページがUTF-8として提供されているかどうかです。HTTP応答のヘッダーを確認してください。Content-Type: text/html; charset=utf-8ヘッダーがあるはずです。それが間違っている、欠落している、または欠落しているcharset=utf-8場合、ブラウザは間違った文字セットを選択する可能性があります。もう1つ良いことは、 ;に<meta charset=utf-8>タグを追加することです。HTTPヘッダーの一部として文字セットを送信する場合はこれは必要ありませんが、ヘッダーが存在しない場合、またはドキュメントがURLなど<head>から読み込まれる場合は、正しい文字セットを選択するのに役立ちます。file:利用可能なヘッダーがあります。

accept-charsetブラウザはフォームを送信するときにドキュメントの文字セットを使用する必要がありますが、フォームの属性を使用して、正しい文字セットを使用して送信するようにすることができます<form accept-charset=utf-8>。これにより、ページのヘッダーに文字セットが設定されていない場合でも、フォームはデータをUTF-8として送信します。

最後に、それがすべて正しい場合でも、ユーザーがエンコード設定を変更した場合、IE5から8はページが送信されるものとは異なるエンコードでデータを送信することがあります。UTF-8データの送信を強制するには、Windows-1252などの従来のエンコードではエンコードできない文字を含む非表示のフォーム属性を使用できます。Ruby on Railsの一部のバージョンでは、この目的で雪だるま( )を使用することで有名ですが、後でわかりにくいようにチェックマーク(✓)に変更されました。フォームに同様の要素を追加して、IEにUTF-8を使用させることができます<input name="_utf7" type="hidden" value="&#x2713;">

上記の提案が機能しない場合は、使用しているブラウザ、プログラミング言語、Webフレームワーク、データベースをお知らせください。また、問題を示す短い自己完結型のサンプルコードを提供してみてください。

于 2012-11-26T23:19:30.353 に答える