PHP â € ™ karakterini değiştirme

8 Cevap php

Ben bu garip sağ tek tırnak karakteri değiştirmek için çalışırken bir sabit zaman yaşıyorum. Ben böyle str_replace kullanıyorum:

str_replace("’", '\u1234', $string);

Ben alıntı gerçekten ne karakter çözemiyorum gibi görünüyor. Ben phpMyAdmin bunu doğrudan kopyalayıp yapıştırın bile hala çalışmıyor. Bir şekilde bunu kaçmak zorunda mıyım?

The character:

  • MySQL Karakter Seti: UTF-8 Unicode (utf8)
  • MySQL Alfabe: utf8_unicode_ci
  • <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

EDIT: It turned out to be a Microsoft left single quote which I could replace with this function from Phill Paffords comment. Not sure which answer I should mark now..

8 Cevap

Bu da başıma geldi etmişti. Birkaç şey:

  • Metin için htmlentities işlevini kullanın

    $my_text = htmlentities($string, ENT_QUOTES, 'UTF-8');

More info about the htmlentities function.

  • Uygun belge türü kullanmak, bu benim için hile yaptı.

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

  • utf-8 kodlama türü sayfanızda kullanın:

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

İşte sayfanız için son prototipi:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>    
<body>

<?php     
    // your code related to database        
    $my_text = htmlentities($string, ENT_QUOTES, 'UTF-8');    
?>

</body>
</html>

.

Eğer replace bu ancak, mb_ereg_replace fonksiyonunu denemek istiyorsanız.

Example:

mb_internal_encoding("UTF-8");
mb_regex_encoding("UTF-8");

$my_text = mb_ereg_replace("’","'", $string);

Ben aynı sorunu vardı ve iş buldum:

function replace_rsquote($haystack,$replacewith){
   $pos = strpos($haystack,chr("226"));
   if($pos > -1){
       return substr_replace($haystack,$replacewith,$pos,3);
   } else return $haystack;
}

Örnek:

echo replace_rsquote("Nick’s","'"); //Nick's

, Ne karakteri bulmak size karakterin ASCII kodu verecektir ord fonksiyonu aracılığıyla çalıştırmak için:

echo ord('’'); // 226

Şimdi bunun ne olduğunu biliyoruz, bunu yapabilirsiniz:

str_replace('’', chr(226), $string);

Eğer PHP kodu ASCII olmayan karakterler kullanıyorsanız, size işliyoruz veri olarak aynı karakter kodlamasını kullandığınızdan emin olmak gerekir. Eğer $string daha PHP komut farklı bir karakter kodlaması kullanıyor çünkü girişimi muhtemelen başarısız olur.

Eğer UTF-8 gibi bir baytlı karakter kodlamasını kullanarak eğer Ayrıca, aynı zamanda multibyte aware string functions kullanmalısınız.

To replace it:

Lütfen komut dosyası size değiştirme yapmaya çalışıyoruz veri olarak aynı kodlama kodlanmış ise, bunu yayınlanmıştır şekilde çalışması gerekir. UTF-8 veri ile çalışıyorsanız, komut dosyası UTF-8 olarak kodlanmış olduğundan emin olun ve bunu yapıştırın zaman sessizce karakteri transliterating senin editörü değil.

O iş olmaz ise, aşağıda açıklandığı gibi kaçan denemek ve döndürür hangi kod bakın.

To escape it:

Kaynak dosyasını UTF-8 olarak kodlanmış ise, bu çalışması gerekir:

$string = htmlentities($string, ENT_QUOTES, "UTF-8");

html... olduğu varsayılan karakter kümesi iso-8859-1. Bundan farklı bir şey açıkça belirtilmelidir.

Daha karmaşık bir karakter dönüştürme sorunları için her zaman htmlentities() gibi işlevlerine Kullanıcı Katkıda Notlar kontrol, orada bulunan gerçek taşlar genellikle vardır.

In General:

Bobince onlar seni kıçından lokma değil çok doğru yaptığı açıklamada, sistemik karakter seti sorunları sistematik olarak sıralanması gerektiğini - sadece tanımlayarak yolun her adımında kullanılan hangi karakter kümesi ise:

  • Nasıl komut dosyası kodlanmış;
  • Belge servis edilir nasıl;
  • Veri veritabanında saklanır nasıl;
  • Veritabanı bağlantısı nasıl kodlandığını.

Neden htmlspecialchars'dan (yoluyla dize çalıştırmak) ve çıkış o içine karakteri ne çıkıyor, böylece değiştirmek ifadesi olarak kullanmak ne bilmiyor?

Eğer varsa bu karakter Right Single Quotation Mark olduğunu.

Bir model ile değiştirmek için böyle bir şey yapmak isteyeceksiniz

$string = preg_replace( "/\\x{2019}/u", 'replacement', $string );

Ama bu gerçekten sadece belirti adresleri. Sorun Diğerleri de belirtildiği gibi, sizin uygulama boyunca karakter kodlamaları tutarlı kullanımını yok olmasıdır.

Herhangi bir düzenli ifade işlevleri (preg_replace veya mb_ereg_replace) kullanmayın. Bunun için ağır yol vardır.

str_replace(chr(226),'\u2019' , $string);

Iğne senin bir çokbaytlı karakter ise, bu ısmarlama fonksiyonu ile daha iyi şans olabilir:

<?php 
function mb_str_replace($needle, $replacement, $haystack) {
    $needle_len = mb_strlen($needle);
    $replacement_len = mb_strlen($replacement);
    $pos = mb_strpos($haystack, $needle);
    while ($pos !== false)
    {
        $haystack = mb_substr($haystack, 0, $pos) . $replacement
                . mb_substr($haystack, $pos + $needle_len);
        $pos = mb_strpos($haystack, $needle, $pos + $replacement_len);
    }
    return $haystack; 
} 
?>

Kredi bu son işlev için: http://www.php.net/manual/en/ref.mbstring.php#86120