Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: str_replace i problem z dodatkowymi znakami znikąd
Forum PHP.pl > Forum > PHP
tosiek
Witam. Zrobiłem sobie konwerter, mam 3 tablice utf8, latin1 i latin2
przykłady:
utf8
  1. <?php
  2. $utf8 = array(
  3.        &#092;"c485\"
  4. );
  5. ?>

latin1
  1. <?php
  2. $latin1 = array(
  3.        &#092;"c2b1\"
  4. );
  5. ?>

no i latin2
  1. <?php
  2. $latin2 = array(
  3.        &#092;"b1\"
  4. );
  5. ?>

Jam łatwo zauważyć są to wartości hexowe, tyle że w latin1 i utf8 są po dwie a w latin2 tylko jedna
teraz otwieram sobie plik
  1. <?php
  2. $plik = file_get_contents('latin2.sql');
  3. ?>

a potem zamieniam zawartość na hexy
  1. <?php
  2. print $plik.&#092;"
  3. &#092;";
  4.    $plik2 = bin2hex($plik);
  5.    print $plik2.&#092;"
  6. &#092;";
  7. ?>

i podmieniam z latin2 na utf8
  1. <?php
  2. $plik3 = str_replace($latin2, $utf8, $plik2);
  3. ?>

i zmaineiam na tekst

  1. <?php
  2. $plik5 = pack(&#092;"H*\", $plik3);
  3. ?>

i potem zapisuje do pliku

Ale właśnie pryz podmianie z latin2 na dowolne inne, dodaje dziwne znaki typu ]* i inne.
Dzieje się tak przy dłuższych kawałkach tekstu np:

Kod
ąćęłńóśźż  ĄĆĘŁŃÓŚŹŻ
  b1e6eab3f1f3b6bcbf0d0aa1c6caa3d1d3a6acaf
  c485c487c499c582c584c3b3c59bc5bc5b95bc0d0c5b9484c486c498c581c583c393c59ac5b
498f
  Ä�Ä�Ä�Ĺ�Ĺ�ĂłĹ�Ĺź[�ź   [��Ä�Ä�Ĺ�Ĺ�Ă�Ĺ�ĹšI�


powinno wyjść takie coś:
Kod
ąćęłńóśźş
ĄĆĘĹ�ĹƒĂ“ĹšĹšĹť


a wychodzi:
Kod
ąćęłńóśş[•ź
  [”„ĆĘĹ�ĹƒĂ“ĹšĹšI�


I dzieje sie tak tlyko wtedy kiedy jest podmiana z tablicy latin2 na dowolną, i nie wiem czemu i jak temu zaradzić zeby podmieniało jednego hexa na dwa ?

Dodam że pojedyncza podmiana też nic nie daje
Kod
$zm1 = preg_match($latin2[0], $utf8[0], $plik2);
    $zm2 = preg_match($latin2[1], $utf8[1], $zm1);
    $zm3 = preg_match($latin2[2], $utf8[2], $zm2);
    $zm4 = preg_match($latin2[3], $utf8[3], $zm3);
    $zm5 = preg_match($latin2[4], $utf8[4], $zm4);
    $zm6 = preg_match($latin2[5], $utf8[5], $zm5);
    $zm7 = preg_match($latin2[6], $utf8[6], $zm6);
    $zm8 = preg_match($latin2[7], $utf8[7], $zm7);
    $zm9 = preg_match($latin2[8], $utf8[8], $zm8);
    $zm10 = preg_match($latin2[9], $utf8[9], $zm9);
    $zm11 = preg_match($latin2[10], $utf8[10], $zm10);
    $zm12 = preg_match($latin2[11], $utf8[11], $zm11);
    $zm13 = preg_match($latin2[12], $utf8[12], $zm12);
    $zm14 = preg_match($latin2[13], $utf8[13], $zm13);
    $zm15 = preg_match($latin2[14], $utf8[14], $zm14);
    $zm16 = preg_match($latin2[15], $utf8[15], $zm15);
    $zm17 = preg_match($latin2[16], $utf8[16], $zm16);
    $zm18 = preg_match($latin2[17], $utf8[17], $zm17);
Prym
hmm, czy warto się tak przemęczać? sprawdź czy nie masz uruchomionej funkcji iconv w swoim PHP.
proponuje poczytać tutaj php.net/iconv o tym jakże potrzebnym/przydatnym narzędziu winksmiley.jpg

co do ogólnego problemu jaki ci występuje to niestety nie wiem skąd masz te znaczki, ale może przeróbka na iconv cię poratuje
tosiek
O iconv wiem.. ale... nie łyknie latin1.


Prym w tym problem że nie działa jedno z potrzebnych konwersji z latin2 na latin1. Bo z latin 2 na utf8 przerabiam za pomocą:
[php$plik3 = mb_convert_encoding($plik, "utf-8", "iso-8859-2");[/php]

W tym problem że w latin1 nie istnieją polskie znaki, a z reguły w tym kodowaniu są bazy, a żeby było trudniej to kopie baz są zapisane w utf8 z krzaczkami z latin1.

Więc żaden konwerter tego nie łyknie. Tylko nie wiem czemu ale np. str replace w wersji sensitive daje jeszcze inne błędy, wiec coś jest z tą podmianą, bo pojedyncze znaki podmienia ok, ale gubi się przy ciągu do podmiany. I to tylko wtedy kiedy z jednego hexa ma zrobić dwa ;/

Ale znalazłem ciekawą opcję na około i bym musial dodatkowe tablice ;/

utf8-decode" title="Zobacz w manualu PHP" target="_manual

Tylko nie wiem czemu tamto poprzednie nie działa, brakuje opcji żeby szukało tylko tych ciągów i nic więcej, bo dziwnie jakby fixuje przy podobnych hexach hmm np:
z bc, bf, a1, af
na c5ba, c5bc, c484, c5bb
daje efekt c5b, 5bc, 0c5b9484, 498f
To pogrubione jest na końcu, reszta to jest to w pierwszej lini obok siebie
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.