Parsowanie tekstowej reprezentacji znaków Unicode

0

Chcę przekonwertować taki string 226-130-172|196-135|197-155 na €ćś (w UTF8), tak abym mógł to zapisać do bazy a nie wyświetlać na stronie. Znaki oddziela |' a kolejne bajty znaku -

Ktoś coś...?

3
AndyCross napisał(a):

Chcę przekonwertować taki string 226-130-172|196-135|197-155 na €ćś (w UTF8), tak abym mógł to zapisać do bazy a nie wyświetlać na stronie. Znaki oddziela |' a kolejne bajty znaku -

No to jeśli to jest faktycznie unicode, to nie potrzebujesz osobnego oddzielenia | i -. Taki string 226,130,172,196,135,197,155 też dałoby się poprawnie odkodować na €ćś.

Ale wracając.

Masz swój string $string = '226-130-172|196-135|197-155';

Najpierw trzeba wyciągnąć jakoś osobne cyfry, możesz to zrobić na trzy sposoby:

  • preg_match_all('/\d+/', $string, $digits);
    return $digits[0];
    
  • $bytes = preg_split('/[|-]/', $string, -1, PREG_SPLIT_NO_EMPTY);
    
  • foreach (explode('|', $string) as $character) {
      foreach (explode('-', $character) as $byte) {
        $bytes[] = $byte;
      }
    }
    
  • Pewnie są inne sposoby, możliwe że z array_merge(...$something) żeby spłaszczyć ciąg, albo z czymś innym, to nie istotne.

Czyli teraz mamy w $bytes taką treść ['226','130','172','196','135','197','155]

No i teraz wystarczy zamienić kazdy z bajtów na int, i zwrócić go jako znak, można to zrobić np tak:

$string = \implode('', \array_map('chr', $bytes));

albo

$string = '';
foreach ($bytes as $byte) {
  $string .= chr($byte);
}

I w $string powinno być €ćś.

2
AndyCross napisał(a):

Chcę przekonwertować taki string 226-130-172|196-135|197-155 na €ćś (w UTF8), tak abym mógł to zapisać do bazy a nie wyświetlać na stronie

Pytanie jaka baza wymaga tak karkołomnego i niewydajnego pamięciowo sposobu zapisu unikodu?
Albo jeśli masz ten zapis cyfrowy a do bazy chcesz zapisać normalnie, to pytanie skąd taki dziwny zapis?

Brzmi jak nieadekwatny sposób rozwiązania jakiegoś problemu…

0

Rewelacja.
Działa. Dzięki!

Riddle napisał(a):

No to jeśli to jest faktycznie unicode, to nie potrzebujesz osobnego oddzielenia | i -. Taki string 226,130,172,196,135,197,155 też dałoby się poprawnie odkodować na €ćś.

i to jest ta złota myśl która nie chciała mnie oświecić.

0

Ale to Ty kreujesz tego stringa czy dostajesz go z jakiegoś miejsca, pliku, endpointu. Nie masz wpływu na to by to w ogóle wywalić do kosza?

0

@AndyCross: Muszę się zgodzić z @jurek1980 oraz @Azarien

Powiedz nam, skąd w ogóle bierzesz ten string. Przychodzi do Ciebie skądś, czy sam go tworzysz?

0

Nie mogę zbyt dokładnie....Ale, bierze się z rozkodowania parametru przesyłanego z programu pracującego lokalnie, napisanego pod .NET. Danych przesyłanych nie jest dużo więc da radę. Służą jedynie weryfikacji użytkownika i jego komputera (taki wewnętrzy system licencji), bo sam program służy do współpracy z tachimetrem robotycznym (np. Leica) i udostępnia algorytmy przekształceń i obliczeń w 3D.

0

OK, jak nie można to nie można.

1
AndyCross napisał(a):

Nie mogę zbyt dokładnie....Ale, bierze się z rozkodowania parametru przesyłanego z programu pracującego lokalnie, napisanego pod .NET. Danych przesyłanych nie jest dużo więc da radę. Służą jedynie weryfikacji użytkownika i jego komputera (taki wewnętrzy system licencji), bo sam program służy do współpracy z tachimetrem robotycznym (np. Leica) i udostępnia algorytmy przekształceń i obliczeń w 3D.

Bardzo dziwne rozwiązanie, czemu nie wziąć tego ciągu w unicode i zrobić base64?

Brzmi jak giga hack.

0

Bardzo dziwne rozwiązanie, czemu nie wziąć tego ciągu w unicode i zrobić base64?

No chyba macie rację. To miała być tylko taka drobnostka na szybko, dodatek bez większego wpływu na meritum. Ale to base64 może być ciekawe. Musze tylko sprawdzić co na to Frameworki .NETa. Dzięki.

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