PHP utf kodlama sorunu

2 Cevap php

PHP nasıl UTF-16BE formatında dizeleri kodlamak? "Demo Mesaj!" Için kodlanmış dize ''00440065006D006F0020004D00650073007300610067006 olmalıdır. Ayrıca, bu formata Arapça karakterleri kodlamak gerekir.

2 Cevap

Her şeyden önce, bu sadece bir charset olan absolutly UTF-8 değil (i.e. a way to store strings in memory / display them).

Burada ne var her karakter oluşturmak için kullanılan bayt bir dökümü gibi görünüyor.

Eğer öyleyse, bu bayt bu şekilde alabilir:

$str = utf8_encode("Demo Message!!!");

for ($i=0 ; $i<strlen($str) ; $i++) {
    $byte = $str[$i];
    $char = ord($byte);
    printf('%02x ', $char);
}

Ve aşağıdaki çıktıyı almak istiyorum:

44 65 6d 6f 20 4d 65 73 73 61 67 65 21 21 21 


But, once again, this is not UTF-8 : in UTF-8, like you can see in the example I've give, D is stored on only one byte : 0x44

Ne yayınlanmıştır, bu iki bayt kullanarak saklanan: 0x00 0x44.

Belki de UTF-16 çeşit kullanıyorsun?



EDIT after a bit more testing and @aSeptik's comment : Bu gerçekten UTF-16.

Eğer alıyoruz dökümü tür almak için, emin dize, mb_convert_encoding {[(örneğin, kullanarak, bu şekilde yapılabilir ki, UTF-16 kodlanmış yapmak gerekecek 1)]} fonksiyonu:

$str = mb_convert_encoding("Demo Message!!!", 'UTF-16', 'UTF-8');

Sonra, bu dize olun bayt üzerinde yineleme, ve ben daha önce yaptığım gibi, kendi değerlerini damping meselesi:

for ($i=0 ; $i<strlen($str) ; $i++) {
    $byte = $str[$i];
    $char = ord($byte);
    printf('%02x ', $char);
}

Ve şu çıktıyı alırsınız:

00 44 00 65 00 6d 00 6f 00 20 00 4d 00 65 00 73 00 73 00 61 00 67 00 65 00 21 00 21 00 21 

Tür youy :-) yayınlanmıştır ne gibi görünüyor Hangi

(you just have to remove the space in the call to printf - I) = bir daha kolay okunur çıktı almak için orada izin

Örneğin mbstring uzantısı ve onun mb_convert_encoding() işlevini kullanarak.

$in = 'Demo Message!!!';
$out = mb_convert_encoding($in, 'UTF-16BE');

for($i=0; $i<strlen($out); $i++) {
  printf("%02X ", ord($out[$i]));
}

baskılar

00 44 00 65 00 6D 00 6F 00 20 00 4D 00 65 00 73 00 73 00 61 00 67 00 65 00 21 00 21 00 21 

Ya da kullanarak iconv()

$in = 'Demo Message!!!';
$out = iconv('iso-8859-1', 'UTF-16BE', $in);

for($i=0; $i<strlen($out); $i++) {
  printf("%02X ", ord($out[$i]));
}