Lekce 15 - Převody textových řetězců v PHP
V předchozím kvízu, Kvíz - Porovnávání a vyhledávání textových řetězců v PHP, jsme si ověřili nabyté zkušenosti z předchozích lekcí.
V této lekci kurzu PHP funkcí si ukážeme, jak převádět textové řetězce. Například z řetězce hexadecimálních hodnot převedeme na řetězec s ASCII znaky a naopak.
hex2bin()
Je funkce která nám převede řetězec tvořený hexadecimálními
hodnotami na řetězec s ASCII znaky. Často je funkčnost této funkce
zaměňována za převod mezi soustavami, konkrétně z hexadecimální soustavy
na dvojkovou (binární). K takovému účelu však slouží funkce
base_convert()
, kterou si vysvětlíme níže. V případě
neplatného řetězce s hexadecimálními hodnotami nám funkce vrátí
booleanovskou hodnotu false
. Ukažme si několik příkladů:
$hex2bin = hex2bin("54656e746f2074657874206a652076206173636969206b6f646f76616e69"); print_r($hex2bin);
Hexadecimální řetězec ve funkci hex2bin()
se převede na pro
nás čitelný textový řetězec v ASCII kódování.
Výstupem na stránku bude text
"Tento text je v ascii kodovani"
.
$hex2bin = hex2bin("1586515969636861"); print_r($hex2bin);
Je důležité mít na paměti, že se hexadecimální řetězec převádí
na textový řetězec v kódování ASCII. V tabulce ASCII se
nenachází znaky s diakritikou, tudíž při pokusu o převod textu uvedeného
v tomto příkladu (původně "Řeřicha"
) dostaneme na stránku
text "QYicha"
.
$hex2bin = hex2bin("54 65 6e 74 6f 20 74 65 78 74 20 6a 65 20 6e 65 70 6c 61 74 6e 79"); print_r($hex2bin);
Pozor si musíme dávat také na platnost hexadecimálního řetězce. Ač
byla dobrá myšlenka si tyto hodnoty oddělit mezerou, tak ve funkci
hex2bin()
se nesmí vyskytovat jiné znaky než ty hexadecimální
(0-F
, šestnáctková soustava) a řetězec musí mít taktéž
platnou délku. V tomto případě dostaneme na výstup booleanovskou hodnotu
false
a ještě hlášku WARNING
o platnosti
délky hexadecimálního řetězce. Totéž platí u příkladu
níže:
$hex2bin = hex2bin("?!#*"); print_r($hex2bin);
bin2hex()
Funkce bin2hex()
nám převede textový řetězec na
řetězec s hexadecimálními hodnotami. Jedná se vlastně o funkci
opačnou k hex2bin()
a její funkčnost je zaměňována za převod
mezi soustavami, konkrétně z dvojkové (binární) na hexadecimální. Ukažme
si příklad:
$bin2hex= bin2hex("Text do hexadecimalni soustavy"); print_r($bin2hex);
Řetězec s ASCII znaky se nám bez potíží převede na řetězec s hexadecimálními hodnotami. Na výstup dostaneme hexadecimální řetězec:
5465787420646f2068657861646563696d616c6e6920736f757374617679
který se rovná našemu textovému řetězci. Budeme-li se snažit převést znaky s českou diakritikou:
$bin2hex= bin2hex("Česká diakritika"); print_r($bin2hex);
dostaneme na výstup hexadecimální řetězec:
c48c65736bc3a1206469616b726974696b61
který je taktéž rovný našemu textovému řetězci.
base_convert()
I přestože se tato funkce řadí mezi matematické, tak si ji v této lekci
popíšeme. Funkce base_convert()
nám převede náš vstup v
libovolné soustavě do výstupu taktéž v libovolné soustavě. Funkce
přijímá celkem 3 parametry, kde prvním z nich je náš vstup v datovém typu
textového řetězce (string
). Druhým parametrem je specifikace, z
jaké soustavy náš vstup převádíme, resp. v jaké soustavě se nachází.
Posledním parametrem je typ soustavy, v jaké dostaneme náš výstup. Typ
soustavy zadáváme do parametrů funkce jako čísla. Například:
- dvojková soustava -> 2,
- hexadecimální soustava -> 16, atp.
Ukažme si nějaké příklady:
$base_convert = base_convert('a37334', 16, 2); print_r ($base_convert);
Zde dojde k převodu hexadecimálních hodnot a37334
z
hexadecimální soustavy do dvojkové (binární). Výstupem tedy bude
101000110111001100110100
.
$base_convert = base_convert('3745', 8, 10); print_r ($base_convert);
Tady převádíme číslo 3745
z osmičkové soustavy do
desítkové. Výstupem je číslo 2021
:
$base_convert = base_convert('a12f', 2, 16); print_r ($base_convert);
Zkusíme-li převést číslo z chybné soustavy, kde a12f
je
pravděpodobné hexadecimální řetězec, bude funkce ignorovat neplatné
hodnoty, které do soustavy specifikované v prvním parametru nepatří a
zbylé hodnoty budou převedeny do soustavy specifikované ve třetím
parametru. Na výstup dostaneme číslo 1
.
ord()
Funkce ord()
vrací ASCII hodnotu, resp. pozici v ASCII tabulce
prvního bajtu (většinou znaku) našeho řetězce. Funkce přijímá pouze
textový řetězec jako jediný parametr. Opak této funkce (převod ASCII kódu
na znak) je funkce chr()
. Příkladem této funkce může být:
$ord = ord("Zdravím tě světe"); print_r ($ord);
Prvním bajtem v našem textovém řetězci je znak Z
, který
odpovídá hodnotě, resp. pozici 90
v tabulce ASCII. Výstupem na
stránku bude právě tato pozice.
$ord = ord("Řeka"); print_r ($ord);
V tomto případě první bajt znaku Ř
vypíše hodnotu
197
v tabulce ASCII. Pokud se však koukneme na ASCII tabulku,
zjistíme, že ta diakritiku nemá a tudíž je převod chybný. Jde o to, že
funkce ord()
nedokáže převést multibyte znaky
(UTF-8
, UTF-16
). Podporované kódování jsou ASCII,
ISO-8859 a Windows 1252. Další příklad:
$ord = ord("\nDalší nová řádka"); print_r ($ord);
Také znak nového řádku má velikost 1 byte a v tabulce ASCII má svou
hodnotu, konkrétně hodnotu 10
, která bude vypsána na
stránku.
V další lekci, Hashování textových řetězců v PHP, si ukážeme, jak hashovat textové řetězce v PHP.