UTF-8, PHP ve MySQL XML

6 Cevap php

Ben bunu çözmek büyük bir sorun yaşıyorum:

Ben bir MySQL veritabanı kodlama latin1_swedish_ci adları ve adreslerini depolayan bir tablo var.

Ben çıktı UTF-8 XML dosyası çalışıyorum, ama ben şu dizeyle sorun yaşıyorum:

I dosyayı vim zaman Otivägen o Otivägen olarak çıkılır ediliyor. Ayrıca ben almak IE açıldığındaki

"An invalid character was found in text content. Error processing resource"

Ben aşağıdaki kodu vardır:

function fixEncoding($in_str)
{
    $cur_encoding = mb_detect_encoding($in_str) ;
    if($cur_encoding == "UTF-8" && mb_check_encoding($in_str,"UTF-8"))
        return $in_str;
    else
        return utf8_encode($in_str);
}

header("Content-type: text/plain;charset=utf-8");
$mystring = "Otivägen" // this is actually obtained from database;

$myxml = "<myxml>
....
     <node>".$mystring."</node>
....
</myxml>
";
$myxml = fixEncoding($myxml);

Gerçek XML çıktısı aşağıdaki gibidir:

<?xml version="1.0" encoding="UTF-8" ?>
<myxml>
    ....
    <node>Otivägen</node>
    ....
</myxml>

Herhangi bir fikir nasıl vim dosya okur bu yüzden çıktı dosyasını can Otivägen olup Otivägen?

EDIT:

I did mysql_client_encoding() and got latin1
I then did mysql_set_charset()
and again ran mysql_client_encoding() and got utf8, but still the same outputting issues.

Edit 2

Ben komut satırında açmış ve sorguyu çalıştırmak SELECT address1 FROM address WHERE id = 1000;

SELECT address1 FROM address WHERE id = 1000;
Current database: ftpuser_db

+-------------+
|   address1  |
+-------------+
| Otivägen 32 |
+-------------+
1 row in set (0.06 sec)

Şimdiden teşekkürler!

6 Cevap

Ben size terminali Latince-1 olması dışında her şeyi doğru yaptım düşünüyorum.

Ä için UTF-8 serisi Latin-1 olarak gösterilir ise à ¤ C3 A4, olduğunu.

MySQL bağlantı kodlama düzgün ayarlanır UTF-8?

mysql_set_charset() ve mysql_client_encoding() daha fazla bilgi için kontrol edin.

Oh boy. UTF8 sorunları gerçek bir ağrı olabilir ve bir şey sizin için yeniden kodlamaları yapıyor onlar çözmek neredeyse imkansız olsun.

Eğer gerçekten bir ucundan başlayıp ve her süreç UTF8 olduğundan emin olmak gerekir. Bu verilerin yanlış yorumlanması ve 'dönüştürme' senin için gelen süreçte şeyleri kaldırmak. Ancak önemli ölçüde, o da zaten bir şey sizin için mis-kodlanmış metin (evet, ben o sorunu yaşadım) sahip olduğunda çok daha kolay nokta izin verir.

UTF8 için ayarlı değil ve yanlış kodlanmış olabilir tablolarda UTF8 veri varsa Ve, verileri yeniden kodlanmış sonra, son tabloları yapmak gerekir. Aksi takdirde irretrievably verilerinizi zarar verir. Ben de bu sorunu yaşadım.

İlk adımlar:

  • Terminal UTF8 uyumlu olup olmadığını kontrol edin. Gnome-terminalidir. Kterm olduğunu. Eterm değildir.
  • Sizin shell sizin LANG ayarını kontrol edin. Muhtemelen olmalıdır. UTF-8 bunun ucunda değerdir.
  • Bu vim UTF8 ayarını doğru toplayıp kontrol edin. Sen :set encoding ile kontrol edebilirsiniz

Bu dosyaları UTF8 düzenlenebilir anlamına gelecektir.

Şimdi MySQL kontrol edin.

MySQL CLI, do show variables like 'character_set%';. Sonuçlar muhtemelen gibi bir şey olacak:

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     | 
| character_set_connection | latin1                     | 
| character_set_database   | latin1                     | 
| character_set_filesystem | binary                     | 
| character_set_results    | latin1                     | 
| character_set_server     | latin1                     | 
| character_set_system     | utf8                       | 
| character_sets_dir       | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+

Ne hedefliyoruz konum utf8 (eğer görüyorsanız ya da her neyse) tüm bu latin1 değerlerini değiştirmektir.

set names utf8; çoğu değişecek ve veritabanındaki her yeni bağlantı ile bunu yapmak gerekebilir. Bu bir önceki uygulamada benimsemek zorunda çözüm oldu. Değiştirmek için diğer ayarlar I the documentation sizi yönlendirmek gerekir hangi için my.cnf dosyasında bulunmaktadır. Bu, tüm bunları ayarlamak gerekir olası değildir.

Ben zaten çıktı başlıklarını ayarı görüyorum, bu yüzden iyi.

Now Eğer veritabanından veri bakmak ve "yanlış" neden görebilirsiniz.

latin1_swedish_ci bir harmanlama değil, bir charset değildir. Alfabe kendi charset maç gerekiyordu olduğundan, tablo latin1 kullanarak önerir, ancak bu garanti değil.

MySql giriş / çıkış dönüştürmek beri Açıkçası, tabloların charset, burada alakasız. Bu bağlantı charset (mysql_set_charset) için budur. Ancak, düzgün bir şekilde çalışması için, veri tabanında yer alan uygun bir şekilde kodlanmış olması gerekir. Ben dizeleri veritabanında doğru olduğunu kontrol ederek başlamak istiyorum. En basit şey komut satırında giriş ve içinde olmayan ASCII karakterleri olan bir satır seçmek için. Tamam görünüyor mu?

$mystring = "Otivägen" // this is actually obtained from database;

Dikkat edin. Verilerin kodlama $mystring artık php dosyasının kodlama bağlıdır. Yani ya da veritabanında veri olarak aynı olmayabilir.

Çıktı çalışma sorgudan önce SET NAMES utf8

çıktı sonra geri gidin ve çalıştırmak SET NAMES latin1

here, Ben aynı sorun var bak

Bu "çift kodlama" Otivägen gibi görünüyor. Sen Otivägen zaten UTF-8 ise bu davranışı olsun, ve tekrar üzerine utf8_encode () çalıştırın. Örnek:

$str = "Otivägen"; // already an UTF-8 string
echo utf8_encode($str); // outputs Otivägen

Sanırım asıl "çifte kodlama" oluşur emin değilim, ama sizin editör ayarlarına bağlı olabilir. Benim teorim. Gerçek karakter kümesi ISO-8859-1 olarak ayarlanır (Aptana içinde, seçtiğiniz tüm projelerde varsayılan karakter kodlamasını belirlemek için bir dosya üzerinde sağ tıklayarak bu kontrol edin ve "özellikler" seçebilirsiniz:. Eğer Aptana Studio çalıştıran söylüyorlar Lets Aptana ana menüden Preferences -> Genel -> çalışma alanı). Bu durumda, size $myxml ve dize <myxml><node>..., ISO-8859-1 olarak algılandı, ancak $ veritabanından alınan MyString olduğunu UTF-sahip gerçek PHP kaynak dosya ise 8. Bir bütün olarak $ myXML ISO-8859-1 değil, UTF-8 olarak görülüyor beri fixEncoding işlevi sonra, başka bir maddesini çalışır. Bu çift kodlama veritabanından sonuçlar sonuçlanır ve sorunun nedeni olabilir.

Düzenleyicinizde gerçek kaynak dosyasının kodlamasını kontrol ve UTF-8 ayarlı olduğunu doğrulayın. Alternatif olarak, $ myXML için fixEncoding/utf8_encode/utf8_decode uygulanması veya kaldırılması ile deney. Sonuçlarını gözlemlemek ve doğru Otivägen değere için yapılması gerekenleri görmek.