1. Einleitung
Ähnlich zu anderen Programmiersprachen können auch in PHP ASCII-Zeichen in ihren Dezimalwert umgewandelt werden und umgekehrt. So wird etwa aus einem „a” die Zahl 97 und entsprechend aus 97 wiederum ein „a”. Verwendet werden dazu die Funktionen ord() und chr(). Erstere rechnet von ASCII-Zeichen zu Dezimalwert um, letztere von Dezimalwert zu ASCII-Zeichen.
2. Beispiel ord()
In diesem Beispiel wird ord($string) verwendet, um zu den Zeichen „a”, „A” und „X” jeweils ihren Dezimalwert zu bestimmen.
<?php var_dump(ord('a'), ord('A'), ord('X')); ?>
int(97) int(65) int(88)
3. Beispiel chr()
Zuvor wurden bereits die Dezimalwerte zu den Zeichen „a”, „A” und „X” berechnet, welche 97 (a), 65 (A) und 88 (X) lauten. Mit diesen Werten kann nun chr() getestet werden, welches zu einem übergebenen Dezimalwert das zugehörige Zeichen bestimmt.
<?php var_dump(chr(97), chr(65), chr(88)); ?>
string(1) "a" string(1) "A" string(1) "X"
4. ord() und UTF-8
Zeichen außerhalb des ASCII-Bereichs bestehen aus mehreren Byte. Bei Anwendung von ord() wird dann nur der ASCII-Wert des ersten Bytes zurückgegeben. Nachfolgend wird dies anhand des griechischen Buchstabens alpha dargestellt, welcher aus zwei Byte besteht:
<?php var_dump(ord('α')); ?>
int(206)
ord() gibt also standardmäßig nur den Dezimalwert des ersten Bytes von alpha zurück. Will man beide Byte berücksichtigen, dann könnte etwa alpha mit str_split() in seine einzelnen Bytes zerlegt werden. (Eigentlich soll str_split() die Zeichen des übergebenen Strings trennen. Allerdings ist diese Funktion nicht Multibyte-Safe und trennt daher tatsächlich die einzelnen Bytes auf und nicht die einzelnen Zeichen. Zeichen, die aus mehreren Bytes bestehen, werden so in mehrere Array-Elemente zerlegt.)
<?php list($a, $b) = str_split('α'); var_dump(ord($a), ord($b)); ?>
int(206) int(177)
Das erhaltene Ergebnis lässt sich nun per chr() wieder in alpha umwandeln. Dafür muss allerdings auch chr() wieder zwei Mal angewendet werden:
<?php var_dump(chr(206) . chr(177)); ?>
string(2) "α"
5. Alle ord()-Werte eines Strings
Mit der nachfolgenden kleinen Funktion kann ein String in ein Array umgewandelt werden, welches die ASCII-Dezimalwerten all seiner Zeichen enthält. Dies entspricht der Anwendung von ord() auf jedes einzelne Zeichen (bzw. bei Multibyte-Zeichen auf jedes von deren Bytes).
<?php function strToOrd($str) { $out = array(); for ($x=0, $l=strlen($str); $x<$l; $x++) { $out[] = ord($str[$x]); } return $out; } var_dump(strToOrd('α')); var_dump(implode(', ', strToOrd('Dies ist ein kleiner String.'))); ?>
array(2) { [0]=> int(206) [1]=> int(177) } string(131) "68, 105, 101, 115, 32, 105, 115, 116, 32, 101, 105, 110, 32, 107, 108, 101, 105, 110, 101, 114, 32, 83, 116, 114, 105, 110, 103, 46"
6. Mehrere ord()-Werte in String umwandeln
Das Ergebnis der vorherigen Funktion (strToOrd()) kann ebenso leicht wieder umgekehrt werden. Dazu wird nachfolgend die Funktion arrToChr($arr) definiert, welche ein Array von Dezimalwerten entgegennimmt und einen String zurückgibt. Der String entspricht der Anwendung von chr() auf jeden einzelnen Dezimalwert. Hier wird dies mit array_map($callback, $array) erreicht, welches die Funktion $callback auf jedes Element in $array anwendet. (Dies wäre auch eine Möglichkeit, strToOrd() zu implementieren.)
<?php function arrToChr($arr) { return array_map('chr', $arr); } $str = '68, 105, 101, 115, 32, 105, 115, 116, 32, 101, 105, 110, 32, 107, 108, 101, 105, 110, 101, 114, 32, 83, 116, 114, 105, 110, 103, 46'; $str = str_replace(' ', '', $str); $arr = explode(',', $str); var_dump(implode('', arrToChr($arr))); ?>
string(28) "Dies ist ein kleiner String."
7. Alle ASCII-Zeichen
Die nachfolgende Tabelle zeigt alle Zeichen zwischen 1 und 255, die mit chr() generiert werden können. Die erste Spalte enthält den Dezimalwert des Zeichens $x, die zweite Spalte das Ergebnis der Anwendung von chr($x) (also das Zeichen zum Dezimalwert) und die dritte Spalte stellt ord(chr($x)) dar, was wiederum $x entspricht. (Einige der Zeichen werden „kaputt” dargestellt, da es sich um spezielle Sonderzeichen handelt, die eigentlich nicht dafür bestimmt sind, für Ausgaben verwendet zu werden.)
x | chr(x) | ord(chr(x)) |
---|---|---|
1 | 1 | |
2 | 2 | |
3 | 3 | |
4 | 4 | |
5 | 5 | |
6 | 6 | |
7 | 7 | |
8 | 8 | |
9 | 9 | |
10 | 10 | |
11 | 11 | |
12 | 12 | |
13 | 13 | |
14 | 14 | |
15 | 15 | |
16 | 16 | |
17 | 17 | |
18 | 18 | |
19 | 19 | |
20 | 20 | |
21 | 21 | |
22 | 22 | |
23 | 23 | |
24 | 24 | |
25 | 25 | |
26 | 26 | |
27 | 27 | |
28 | 28 | |
29 | 29 | |
30 | 30 | |
31 | 31 | |
32 | 32 | |
33 | ! | 33 |
34 | " | 34 |
35 | # | 35 |
36 | $ | 36 |
37 | % | 37 |
38 | & | 38 |
39 | ' | 39 |
40 | ( | 40 |
41 | ) | 41 |
42 | * | 42 |
43 | + | 43 |
44 | , | 44 |
45 | - | 45 |
46 | . | 46 |
47 | / | 47 |
48 | 0 | 48 |
49 | 1 | 49 |
50 | 2 | 50 |
51 | 3 | 51 |
52 | 4 | 52 |
53 | 5 | 53 |
54 | 6 | 54 |
55 | 7 | 55 |
56 | 8 | 56 |
57 | 9 | 57 |
58 | : | 58 |
59 | ; | 59 |
60 | < | 60 |
61 | = | 61 |
62 | > | 62 |
63 | ? | 63 |
64 | @ | 64 |
65 | A | 65 |
66 | B | 66 |
67 | C | 67 |
68 | D | 68 |
69 | E | 69 |
70 | F | 70 |
71 | G | 71 |
72 | H | 72 |
73 | I | 73 |
74 | J | 74 |
75 | K | 75 |
76 | L | 76 |
77 | M | 77 |
78 | N | 78 |
79 | O | 79 |
80 | P | 80 |
81 | Q | 81 |
82 | R | 82 |
83 | S | 83 |
84 | T | 84 |
85 | U | 85 |
86 | V | 86 |
87 | W | 87 |
88 | X | 88 |
89 | Y | 89 |
90 | Z | 90 |
91 | [ | 91 |
92 | \ | 92 |
93 | ] | 93 |
94 | ^ | 94 |
95 | _ | 95 |
96 | ` | 96 |
97 | a | 97 |
98 | b | 98 |
99 | c | 99 |
100 | d | 100 |
101 | e | 101 |
102 | f | 102 |
103 | g | 103 |
104 | h | 104 |
105 | i | 105 |
106 | j | 106 |
107 | k | 107 |
108 | l | 108 |
109 | m | 109 |
110 | n | 110 |
111 | o | 111 |
112 | p | 112 |
113 | q | 113 |
114 | r | 114 |
115 | s | 115 |
116 | t | 116 |
117 | u | 117 |
118 | v | 118 |
119 | w | 119 |
120 | x | 120 |
121 | y | 121 |
122 | z | 122 |
123 | { | 123 |
124 | | | 124 |
125 | } | 125 |
126 | ~ | 126 |
127 | | 127 |
128 | � | 128 |
129 | � | 129 |
130 | � | 130 |
131 | � | 131 |
132 | � | 132 |
133 | � | 133 |
134 | � | 134 |
135 | � | 135 |
136 | � | 136 |
137 | � | 137 |
138 | � | 138 |
139 | � | 139 |
140 | � | 140 |
141 | � | 141 |
142 | � | 142 |
143 | � | 143 |
144 | � | 144 |
145 | � | 145 |
146 | � | 146 |
147 | � | 147 |
148 | � | 148 |
149 | � | 149 |
150 | � | 150 |
151 | � | 151 |
152 | � | 152 |
153 | � | 153 |
154 | � | 154 |
155 | � | 155 |
156 | � | 156 |
157 | � | 157 |
158 | � | 158 |
159 | � | 159 |
160 | 160 | |
161 | ¡ | 161 |
162 | ¢ | 162 |
163 | £ | 163 |
164 | ¤ | 164 |
165 | ¥ | 165 |
166 | ¦ | 166 |
167 | § | 167 |
168 | ¨ | 168 |
169 | © | 169 |
170 | ª | 170 |
171 | « | 171 |
172 | ¬ | 172 |
173 | | 173 |
174 | ® | 174 |
175 | ¯ | 175 |
176 | ° | 176 |
177 | ± | 177 |
178 | ² | 178 |
179 | ³ | 179 |
180 | ´ | 180 |
181 | µ | 181 |
182 | ¶ | 182 |
183 | · | 183 |
184 | ¸ | 184 |
185 | ¹ | 185 |
186 | º | 186 |
187 | » | 187 |
188 | ¼ | 188 |
189 | ½ | 189 |
190 | ¾ | 190 |
191 | ¿ | 191 |
192 | À | 192 |
193 | Á | 193 |
194 | Â | 194 |
195 | Ã | 195 |
196 | Ä | 196 |
197 | Å | 197 |
198 | Æ | 198 |
199 | Ç | 199 |
200 | È | 200 |
201 | É | 201 |
202 | Ê | 202 |
203 | Ë | 203 |
204 | Ì | 204 |
205 | Í | 205 |
206 | Î | 206 |
207 | Ï | 207 |
208 | Ð | 208 |
209 | Ñ | 209 |
210 | Ò | 210 |
211 | Ó | 211 |
212 | Ô | 212 |
213 | Õ | 213 |
214 | Ö | 214 |
215 | × | 215 |
216 | Ø | 216 |
217 | Ù | 217 |
218 | Ú | 218 |
219 | Û | 219 |
220 | Ü | 220 |
221 | Ý | 221 |
222 | Þ | 222 |
223 | ß | 223 |
224 | à | 224 |
225 | á | 225 |
226 | â | 226 |
227 | ã | 227 |
228 | ä | 228 |
229 | å | 229 |
230 | æ | 230 |
231 | ç | 231 |
232 | è | 232 |
233 | é | 233 |
234 | ê | 234 |
235 | ë | 235 |
236 | ì | 236 |
237 | í | 237 |
238 | î | 238 |
239 | ï | 239 |
240 | ð | 240 |
241 | ñ | 241 |
242 | ò | 242 |
243 | ó | 243 |
244 | ô | 244 |
245 | õ | 245 |
246 | ö | 246 |
247 | ÷ | 247 |
248 | ø | 248 |
249 | ù | 249 |
250 | ú | 250 |
251 | û | 251 |
252 | ü | 252 |
253 | ý | 253 |
254 | þ | 254 |
255 | ÿ | 255 |
Das nachfolgende simple Skript erzeugt die vorherige Tabelle. Es iteriert über die Zahlen von 1 bis 255 und berechnet sowohl chr($x) als auch ord(chr($x)). htmlentities(chr($x)) dient einzig zur besseren Darstellung einiger Zeichen im Browser.
<table id="php-list-ascii-chars"> <thead> <tr> <th>x</th> <th>chr(x)</th> <th>ord(chr(x))</th> </tr> </thead> <tbody> <?php foreach (range(1, 255) as $x): ?> <tr> <td><?php echo $x; ?></td> <td><?php echo htmlentities(chr($x)); ?></td> <td><?php echo ord(chr($x)); ?></td> </tr> <?php endforeach; ?> </tbody> </table>