2010-11-21 7 views
0

を使用しようとすると、私は次のことをしました:PHPのはhtmlspecialchars()関数のエラーUTF-8文字列

  1. 私はデータでスプレッドシートを持っています。行の1つにü文字が含まれています。
  2. 私はこれをOpenOffice.orgのCSVファイルとして保存します。文字エンコーディングを求められたら、私はUTF-8を選択します。
  3. Navicatを使用して、MySQLデータベーステーブル、InnoDBをUTF-8 utf8_generalエンコーディングで作成し、CSVをインポートします。
  4. 私はPHP関数htmlspecialchars($string, ENT_COMPAT, 'UTF-8')を使用しようとしています。ここで、$stringは特殊なü文字を含む文字列です。

エラーが表示されます。引数に無効なマルチバイトシーケンスがあります。 'UTF-8''ISO8859-1'に変更すると、エラーはスローされませんが、不正な文字が表示されます。 ( '不明な文字'の文字は<?>のように見えます)

HTMLフォームを使用してデータベースの文字列を更新すると、エラーが表示されなくなり、文字が正しく表示されます。

[1/4][A with some thing on top of it]

1 character.`で何が起こっているのか

、物事が間違っている、と私はそれについて何ができると見られていないいくつかのマルチバイト:Navicatは、それは2つの文字を探します?

答えて

2

「無効なマルチバイト」エラーがどこから来るか、私は理解していないが、私はhtmlspecialchars()not your culpritあるかなり確信している:

For the purposes of this function, the charsets ISO-8859-1, ISO-8859-15, UTF-8, cp866, cp1251, cp1252, and KOI8-R are effectively equivalent, as the characters affected by htmlspecialchars() occupy the same positions in all of these charsets.

私の理解では、htmlspecialchars()はUTF-8文字列のために正常に動作する必要があります文字セットを指定せずに私の考え方は、フォームを含むHTMLページ、または使用するデータベース接続がUTF-8でエンコードされていないことです。後者の場合、挿入を実行する前に、

をmySQLに送信してみてください。

+0

mysql一般クエリログによれば、実際には 'SET NAMES utf8'がMySQLサーバに送られます。このプロセスにはフォームはありませんが(レコードを更新するときにフォームがあります)、HTMLメタタグを使用してUTF-8に設定されています。 (ただし、フォームが使用される前に、エラーが既にポップアップしています)。 –

+0

@Pelleは、その接続のサーバー*に実際に送信されたことを確認できますか?そして確認するために、あなたが引用したエラーは実際には 'htmlspecialchars()'によってスローされますか? –

+0

それを考え出した。すべてのものはUTF-8でしたが、データのSELECTに使用された場合は例外です。 selectステートメントを修正する前にSET NAMES UTF8を置く。 –