Nasıl UTF-8 için böyle garip bir dize çözmek için?

3 Cevap php

Yani gerçek UTF-8 veya (HTML kişilere benim için daha iyi) içine kaydetmek için %u041E%u043B%u0435%u0433%20%u042F%u043A nasıl var?

3 Cevap

Bu JavaScript escape() biçimidir. Bu URL kodlama benzer ancak uyumlu değil. Bunu hiç kullanmak genellikle bir hatadır.

Yapılacak en iyi şey, (encodeURIComponent()) yerine uygun URL kodlaması kullanmak için, onu üretir senaryoyu değiştirmek için. Sonra urldecode ya da sunucu tarafında herhangi bir diğer normal URL-çözme fonksiyonu ile çözebilir.

Kesinlikle bu non-standart formatta veri değişimi gerekiyorsa, bunun için özel bir dekoder yazmak gerekecek. Burada HTML karakter referans dekoder yararlanarak hızlı kesmek:

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');
}

Bu ham UTF-8 bayt dize döndürür. Eğer gerçekten gibi HTML karakter referansları bunu istiyorsanız Ру... ardından html_entity_decode çağrıyı kapalı bırakın. Ama normalde yok. Iyi ki son çıkışı için kaçtı gereken kadar ham formatında dizeleri tutmak için - ve en iyi hiç karakter başvuruları ASCII olmayan karakterleri değiştirmek için değil gerçekten ihtiyacınız olmadıkça.

bu ne gibi dize bana '% CE% EB% E5% E3 +% DF% EA% F3% F8% EA% E8% ED' gelecek olursa

Bu URL-form-kodlanmış, escape() biçimi ile doğrudan uyumlu değildir bu. URL kodlama ait 2 haneli bayt kaçar deli escape-formatında 4 haneli kod birim kaçar farklı iken, karakter + belirsiz. Bu (dize escape geldiyse) bir artı ortalama, ya da bir boşluk (bir tarayıcı form gönderme geldiyse) olabilir. Olduğunu söylemek hangi yolu yoktur. Bu özelliği kullanmak için başka bir nedendir escape().

Bunun dışında; Bu dize charset UTF-8 olsaydı o zaman evet, yukarıdaki fonksiyon ham UTF-8 bayt içine URL-kodlanmış bayt ve çılgın escape() format Unicode karakterleri hem dönüştürme, iyi olurdu.

Ancak aslında kod sayfası 1251 (Windows Rusça) görünmektedir. Eğer gerçekten CP1251 tüm dizeleri işlemek istiyor musunuz? Eğer öyleyse, farklı bir charset içine dört haneli kaçar kodlamak yapmak için bunu biraz değiştirmek gerekir. Bu dağınık:

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);

Ben şiddetle tavsiye ediyorum:

  1. bu doğru encodeURIComponent kullanır, böylece Flash dosyası tespit değil escape, bu nedenle bu çirkin kesmek yerine bir standart URL-decoder kullanabilirsiniz.

  2. tüm yol uygulaması ile yerine UTF-8 kullanarak, böylece sadece Rusça dışındaki dilleri destekleyebilir ve değişen form sunulan girdi kodlaması konusunda endişelenmenize gerek yok.

(UTF-8 değil Tüm kodlamaları emmek, ve bu bilim tarafından kanıtlanmış bir gerçektir!)

PHP kod çözme işlevi vardır

$string = html_entity_decode($string,ENT_COMPAT,"UTF-8")

Diğer tarafından önerildiği gibi, Unicode HTML varlıkları dönüştürmek. Bu kullandığım regex,

function escapePercentU($s) {
   $s = preg_replace( "/%u([A-Fa-f0-9]{4})/", "&#x$1;", $s);
   return html_entity_decode($s, ENT_COMPAT, 'utf-8');
}