XML UTF-16 (veya UTF-8) değerlerini okuma ve PHP ile sonuç görüntüleme

3 Cevap php

Ben unicode (UTF-16) değerleri ve PHP / XML ile bir sürü sorun yaşıyorum. Ben tarayıcı XML ve çıkış doğru gliflerini unicode değerleri bir dizi okumak istiyorum. Ben UTF-8 ile denedim ve aynı sorunu olsun.

Bu benim ilk test için kullanılan basit bir çalışma örneği:

$text = "\x00\x41";

$text = mb_convert_encoding($text, "ASCII", "UTF-16");

echo $text;

Yukarıdaki kod çıktısı:

A

Ben XML şeylerden değerleri almak için çalıştığınızda, ancak durabilir.

XML:

<glyphs>
    <code>0041</code>
    <code>0042</code>
    <code>0043</code>
    <code>0044</code>
    <code>0045</code>
    <code>0046</code>
</glyphs>

Php Ben yukarıdaki xml her değeri okumak, çiftler ve biçime, örneğin bölünmüş \ X00 \ x41, vb

PHP:

// load xml
$xml = simplexml_load_file('encoding.xml');

if ($xml) {

    // get families
    foreach($xml->children() as $item) {

        $pairs = str_split($item, 2);

        $hex = "\x" . $pairs[0] . "\x" . $pairs[1];

        // check value...
        echo $hex . '<br/>';

        $text = mb_convert_encoding($hex, "ASCII", "UTF-16");

        echo $text;
    }

}
else {
    return 'The input is malformed.';
}

Tarayıcıda Çıktı:

\x00\x41
????
\x00\x42
????
\x00\x43
????
\x00\x44
????
\x00\x45
????
\x00\x46
????

Soru işaretleri A, B, C, D, E, F olmalıdır

Ben yanlış ne yapıyorum?

Teşekkürler.

3 Cevap

Sizin test programı UTF-16 iki bayt ardından ASCII '
' ardından her test karakteri birkaç ASCII karakter için yazıyor. Bu işe yaramaz. Bir dosya bir anda yalnızca bir karakter kodlaması kullanmanız gerekir.

İlk olarak, UTF-16 (ya da ne olursa olsun) tüm çıkış dönüştürmek için senaryoyu yeniden.

İkincisi, tarayıcı UTF-16 dışında başka bir şey, belki de ISO 8859-1 olarak karışık kodlama dosya yorumlama, ya da ortak varsayılanlarıdır Windows Latin 1 olduğu görülmektedir. Bu bir tarayıcı UTF-16 gibi bir dosyayı yorumlamak zannetmiyorum unless explicitly directed to (in the HTTP header or content type meta tag). (Web sunucusu varsayılan bir gönderme olup olmadığını kontrol edin) belirtilmemiş içerik türünü bırakılırsa o zaman bazı tarayıcılar kodlamasını tahmin etmeye çalışmayın. Ben herhangi biri karma dosya UTF-16 oldu sanırım şüpheliyim.

Eğer tarayıcı belirttiğiniz içerik türüne göre dosyayı yorumlama eminseniz kadar istediğiniz gibi bir şey çalışmak beklemeyin.

Son olarak, iconv kullanarak yerine mb_convert_encoding öneririz. iconv daha iyi korunur ve Desteklenen kodlamaların daha geniş bir dizi var.

"\x00" is hex notation inside a string, which is processed at compile time.
I think that when you use "\x" + "00" the compiler first tries to figure out what "\x" is (I have no clue what is the result), and only afterward concatenates the "00", so the result is not what you expect.

Java olmasına rağmen Belki bu soru, yardımcı olabilir -> http://stackoverflow.com/questions/2126378/java-convert-string-uffff-into-char/

EDIT: just following up on the comment. Placing the literal "\x41" in your xml won't help either, because then you are reading a string of 4 characters.
So your problem can be restated as: how to convert a string representation of numerical values in hex to a single character, using UTF-16. It is the same problem as in the question that I linked above, except that you want to do it in php, not Java.

Eğer başlığında doğru çıkışı ayarı mı?

header('Content-Type: text/html; charset=utf-8');

... Ve ayrıca HTML kafasına?

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