2016-08-30 11 views
1

現在、英語、ロシア語、ウクライナ語の入力を受け付けるWebサイトで作業しています。PHP文字列でunicodeが見つかりません

ユーザーは、商標記号(™)、日本語文字(の)、ドイツ語の文字(Ö)などの文字を使用してフォームを送信することがよくあります。大丈夫ですが、時には彼らはどこからこれらの文字をコピー&ペーストするとき、彼らは(0xD8000xDC00)、(0xFFFD)(0x17の)のような入力を提出

、¿(0xbfの)、½(0xBD)、およびï(0xEF)(ちなみに値は0x457のウクライナ文字 'ї'があります)。

その後、その入力がUTF-8 XMLに変換されているとき、それは 、このエラーがスローされます "入力がない適切なUTF-8で、エンコーディングを指定バイト数:!0x17の0xEFという0xbfの0xBD、ライン13330、コラム27"

ユーザー入力でこれらの「壊れた」文字を検証する方法はありますか?

すべての文字を入力文字列からHEX値に変換し、すべての不正なHEX値を含む配列と比較することを考えていました。しかし、このアプローチでは、問題は「壊れた」文字の可能なコードをすべて知ることではないということです。私は0xEF 0xBF 0xBDが頻繁に出現することを知っていますが、そこにはさらに何があるかわかりません。

提案がありますか?

+0

[文字列からUTF8以外の文字を削除](http://stackoverflow.com/questions/1401317/remove-nonの可能性のある重複-utf8-characters-from-string) – iainn

答えて

1

フォームを含むWebページがUTF-8としてエンコードされている場合、最新のブラウザはすべて、有効なUTF-8としてエンコードされたフォームフィールドを送信する必要があります。 (あなたはまだサーバー上でそれを確認する必要があります。)私はここで何が起こっていると思うかは、何か違うものです。バイトシーケンス

0x17 0xEF 0xBF 0xBD 

である有効なUTF-8:U + FFFD置換文字が続く伝送ブロックのU + 0017 END。しかし、あなたはXML処理について言及しており、U + 0017はinvalid in XML 1.0です。 XML 1.0は、唯一の(部分的にXML 1.1 lifts this restriction。)

#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] 

することができます私はXML処理機能に渡す前に置換文字とXMLで許可されていないASCII制御文字を置き換えることをお勧めしたい:

preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F]/', "\xEF\xBF\xBD", $value); 

か、またU + FFFEとU + FFFFを含む:

preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x{FFFE}\x{FFFF}]/u', "\xEF\xBF\xBD", $value); 
-2

おそらくiso-8859-1が動作します。

これが答えかどうかわかりませんが、あなたは難しいと試すことができます。

関連する問題