[PHP] Funkcja Encoding.GetString w php

0

Witam, wczytuję plik w moim skrypcie i potrzebuję użyć funkcji z .NET Frameworka **Encoding.GetString ** http://msdn.microsoft.com/en-us/library/744y86tc.aspx w PHP, jednak nie wiem jak ją napisać.

Plik wczytuję tak:

 echo file_get_contents( $file, null, null, 20, 64 );

i potrzebuję właśnie tej funkcji, gdyż w taki sposób otrzymuję takie dane:

4�/�1�0�/�2�0�0�9� �2�:�4�6� �P�M������@��| ß�H�>�˙˙˙˙Źß�ź���

a chciałbym otrzymać:

4/10/2009 2:46 PM

Proszę o jakieś sugestie albo coś co by mi w tym pomogło.

Pozdrawiam noxwow

0

Chcesz do tego .NETa zaprzęgać i to jeszcze w PHP? Good luck.

Wiesz co to jest kodowanie? Powiem ci że różni się w twoim skrypcie i źródle z którego pobierasz... Obstawiam UTF-8.

Użyj iconv albo zapisz plik ze skryptem .php w kodowaniu UTF-8 bez BOM.

0

To nie tak. Chodzi mi o napisanie odpowiednika tej funkcji z .NET Frameworka w PHP. Konwersacje nic nie dają. W Hex edytorze te dane wyglądają tak:

34002F00310030002F003200300030003900200032003A0034003600200050004D000000040000004000917CA0DF12

używając w nim wyszukiwarki to to muszę zaznaczyć Unicode string aby znaleźć to czego szukam.

0

Z wikipedii:

UTF-8 - system kodowania Unicode.

Zakoduj plik ze skryptem w UTF-8 bez BOM używając Notepad++ albo użyj iconv i będzie działało :O
Pierwszy sposób wydaje się bez sensu, ale PHP domyślnie używa takiego samego kodowania co plik ze skryptem który aktualnie mieli.

1

Ten tekst jest zakodowany w UTF-16 (Little endian). Tylko uważaj, bo za nim są jakieś śmieci, które wysypują iconva

<?php

$data = pack( "H*", "34002F00310030002F003200300030003900200032003A0034003600200050004D00" ); // 0000040000004000917CA0DF12" );

header( "Content-Type: text/plain; charset=utf-8" );
echo iconv( "UTF-16LE", "UTF-8", $data );

?>
0

Dzięki! O to mi chodziło. Napisałem sobie procedurę do tego, jeżelibyście mogli, to powiedzcie, co ewentualnie mógłbym uprościć:

function readString( $string, $start, $length )
{
    $data = substr( $string, $start, $length );
    $data = bin2hex( $data );
    $data = pack( 'H*', $data );
    $data = iconv( 'UTF-16LE', 'UTF-8', $data );
    return $data;
}

$test = file_get_contents( $file );

echo readString( $test, 20, 34 );

Pozdrawiam noxwow

0

Po pierwsze wywal linijki z "bin2hex" i "pack". Użyłem funkcji pack() tylko dlatego, bo łatwiej mi było skopiować wyciąg z hexedytora (twój drugi post) niż te krzaki z twojego pierwszego posta. Jako że pack( "H*", ... ) można przetłumaczyć jako "hex2bin", to te dwie linijki nic ci nie dają.

Pamiętaj też, że PHP nie wspiera unicode - dla niego istnieją tylko jednobajtowe znaki. Wyłuskanie 3 pierwszych znaków zakodowanych w UTF-16 to:
substr( $data, 0, 6 );

więc jeśli argumenty $start i $length twojej funkcji oznaczają znaki, a nie bajty, to wewnątrz funkcji powinieneś je pomnożyć razy 2.

0

I właśnie po to wymyślono rozszerzenie mb i funkcję mb_substr.
http://php.net/manual/pl/function.mb-substr.php

0

Dzięki serdecznie. Problem rozwiązany.

Pozdrawiam i wesołych świąt noxwow

1 użytkowników online, w tym zalogowanych: 0, gości: 1