それで%u041E%u043B%u0435%u0433%20%u042F%u043A
、それを実際のUTF-8に保存する方法がありますか(HTMLエンティティの方が良いですか)?
3 に答える
それが JavaScriptescape()
形式です。URL エンコーディングに似ていますが、互換性はありません。それをまったく使用することは、通常は間違いです。
最善の方法は、それを生成するスクリプトを変更して、encodeURIComponent()
代わりに適切な URL エンコード ( ) を使用することです。次に、urldecode
またはサーバー側の他の通常の URL デコード関数を使用してデコードできます。
この非標準形式のデータをどうしても交換しなければならない場合は、そのためのカスタム デコーダーを作成する必要があります。HTML character-reference-decoder を利用した簡単なハックを次に示します。
function jsunescape($s) {
$s= preg_replace('/%u(....)/', '&#x$1;', $s);
$s= preg_replace('/%(..)/', '&#x$1;', $s);
return html_entity_decode($s, ENT_COMPAT, 'utf-8');
}
これは生の UTF-8 バイト文字列を返します。本当に HTML 文字参照でそれが必要な場合は、呼び出しРу...
をやめてください。html_entity_decode
しかし、通常はそうではありません。最終的な出力のためにエスケープする必要があるまで、文字列を未加工の形式で保持するのが最善です。また、本当に必要でない限り、非 ASCII 文字を文字参照に置き換えないのが最善です。
このような文字列が私に来るとしたら ' %CE%EB%E5%E3+%DF%EA%F3%F8%EA%E8%ED'
これは URL フォーム エンコードされており、形式と直接互換性がありませんescape()
。URL エンコーディングの 2 桁のバイト エスケープはクレイジーなescape
形式の 4 桁のコード単位エスケープとは異なりますが、文字+
はあいまいです。プラス (文字列が から来た場合escape
) またはスペース (ブラウザー フォームの送信から来た場合) を意味する可能性があります。それがどれであるかを知る方法はありません。これは、使用しないもう 1 つの理由escape()
です。
それとは別に; この文字列の文字セットが UTF-8 の場合、はい、上記の関数は問題なく、URL エンコードされたバイトとクレイジーなescape()
形式の Unicode 文字の両方を生の UTF-8 バイトに変換します。
ただし、実際にはコード ページ 1251 (Windows ロシア語) のようです。すべての文字列を cp1251 で処理しますか? その場合は、4 桁のエスケープを別の文字セットにエンコードするように少し変更する必要があります。これは面倒です:
function url_or_maybe_jsescape_decode($s, $charset, $isform) {
if ($isform)
$s= str_replace('+', ' ', $s);
$s= preg_replace('/%u(....)/', '&#x$1;', $s);
$s= preg_replace('/%(..)/', '&!#x$1;', $s);
$s= html_entity_decode($s, ENT_COMPAT, $charset);
$s= str_replace('&!', '&', $s);
$s= html_entity_decode($s, ENT_COMPAT, 'utf-8');
return $s;
}
echo url_or_maybe_jsescape_decode('%CE%EB%E5%E3+%DF%EA%F3%F8%EA%E8%ED', 'cp1251', TRUE);
私は強くお勧めします:
を使用するように Flash ファイルを修正する
encodeURIComponent
とescape
、この醜いハックの代わりに標準の URL デコーダーを使用できます。アプリケーション全体で代わりに UTF-8 を使用すると、ロシア語以外の言語をサポートでき、送信されたフォームの入力エンコーディングが変更されることを心配する必要がなくなります。
(UTF-8 以外のすべてのエンコーディングは最悪です。これは科学によって証明された事実です!)
PHPにはデコード機能があります
$string = html_entity_decode($string,ENT_COMPAT,"UTF-8")
他の人が提案したように、それを Unicode HTML エンティティに変換します。これは私が使用する正規表現です。
function escapePercentU($s) {
$s = preg_replace( "/%u([A-Fa-f0-9]{4})/", "&#x$1;", $s);
return html_entity_decode($s, ENT_COMPAT, 'utf-8');
}