Verzeichnisstruktur phpBB-3.0.0


Veröffentlicht
12.12.2007

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

utf_normalizer_test.php

Zuletzt modifiziert: 09.10.2024, 12:50 - Dateigröße: 7.41 KiB


001  <?php
002  /**
003  *
004  * @package phpBB3
005  * @version $Id$
006  * @copyright (c) 2005 phpBB Group
007  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
008  *
009  */
010   
011  if (php_sapi_name() != 'cli')
012  {
013      die("This program must be run from the command line.\n");
014  }
015   
016  //
017  // Security message:
018  //
019  // This script is potentially dangerous.
020  // Remove or comment the next line (die(".... ) to enable this script.
021  // Do NOT FORGET to either remove this script or disable it after you have used it.
022  //
023  die("Please read the first lines of this script for instructions on how to enable it");
024   
025  set_time_limit(0);
026  error_reporting(E_ALL);
027   
028  define('IN_PHPBB', true);
029  $phpbb_root_path = '../';
030  $phpEx = substr(strrchr(__FILE__, '.'), 1);
031   
032   
033  /**
034  * Let's download some files we need
035  */
036  download('http://www.unicode.org/Public/UNIDATA/NormalizationTest.txt');
037  download('http://www.unicode.org/Public/UNIDATA/UnicodeData.txt');
038   
039  /**
040  * Those are the tests we run
041  */
042  $test_suite = array(
043      /**
044      * NFC
045      *   c2 ==  NFC(c1) ==  NFC(c2) ==  NFC(c3)
046      *   c4 ==  NFC(c4) ==  NFC(c5)
047      */
048      'NFC'    =>    array(
049          'c2'    =>    array('c1', 'c2', 'c3'),
050          'c4'    =>    array('c4', 'c5')
051      ),
052   
053      /**
054      * NFD
055      *   c3 ==  NFD(c1) ==  NFD(c2) ==  NFD(c3)
056      *   c5 ==  NFD(c4) ==  NFD(c5)
057      */
058      'NFD'    =>    array(
059          'c3'    =>    array('c1', 'c2', 'c3'),
060          'c5'    =>    array('c4', 'c5')
061      ),
062   
063      /**
064      * NFKC
065      *   c4 == NFKC(c1) == NFKC(c2) == NFKC(c3) == NFKC(c4) == NFKC(c5)
066      */
067      'NFKC'    =>    array(
068          'c4'    =>    array('c1', 'c2', 'c3', 'c4', 'c5')
069      ),
070   
071      /**
072      * NFKD
073      *   c5 == NFKD(c1) == NFKD(c2) == NFKD(c3) == NFKD(c4) == NFKD(c5)
074      */
075      'NFKD'    =>    array(
076          'c5'    =>    array('c1', 'c2', 'c3', 'c4', 'c5')
077      )
078  );
079   
080  require_once($phpbb_root_path . 'includes/utf/utf_normalizer.' . $phpEx);
081   
082  $i = $n = 0;
083  $failed = false;
084  $tested_chars = array();
085   
086  $fp = fopen($phpbb_root_path . 'develop/NormalizationTest.txt', 'rb');
087  while (!feof($fp))
088  {
089      $line = fgets($fp);
090      ++$n;
091   
092      if ($line[0] == '@')
093      {
094          if ($i)
095          {
096              echo "done\n";
097          }
098   
099          $i = 0;
100          echo "\n", substr($line, 1), "\n\n";
101          continue;
102      }
103   
104      if (!strpos(' 0123456789ABCDEF', $line[0]))
105      {
106          continue;
107      }
108   
109      if (++$i % 100 == 0)
110      {
111          echo $i, ' ';
112      }
113   
114      list($c1, $c2, $c3, $c4, $c5) = explode(';', $line);
115   
116      if (!strpos($c1, ' '))
117      {
118          /**
119          * We are currently testing a single character, we add it to the list of
120          * characters we have processed so that we can exclude it when testing
121          * for invariants
122          */
123          $tested_chars[$c1] = 1;
124      }
125   
126      foreach ($test_suite as $form => $serie)
127      {
128          foreach ($serie as $expected => $tests)
129          {
130              $hex_expected = ${$expected};
131              $utf_expected = hexseq_to_utf($hex_expected);
132   
133              foreach ($tests as $test)
134              {
135                  $utf_result = $utf_expected;
136                  call_user_func(array('utf_normalizer', $form), $utf_result);
137   
138                  if (strcmp($utf_expected, $utf_result))
139                  {
140                      $failed = true;
141                      $hex_result = utf_to_hexseq($utf_result);
142   
143                      echo "\nFAILED $expected == $form($test) ($hex_expected != $hex_result)";
144                  }
145              }
146          }
147   
148          if ($failed)
149          {
150              die("\n\nFailed at line $n\n");
151          }
152      }
153  }
154  fclose($fp);
155   
156  /**
157  * Test for invariants
158  */
159  echo "\n\nTesting for invariants...\n\n";
160   
161  $fp = fopen($phpbb_root_path . 'develop/UnicodeData.txt', 'rt');
162   
163  $n = 0;
164  while (!feof($fp))
165  {
166      if (++$n % 100 == 0)
167      {
168          echo $n, ' ';
169      }
170   
171      $line = fgets($fp, 1024);
172   
173      if (!$pos = strpos($line, ';'))
174      {
175          continue;
176      }
177   
178      $hex_tested = $hex_expected = substr($line, 0, $pos);
179   
180      if (isset($tested_chars[$hex_tested]))
181      {
182          continue;
183      }
184   
185      $utf_expected = hex_to_utf($hex_expected);
186   
187      if ($utf_expected >= UTF8_SURROGATE_FIRST
188       && $utf_expected <= UTF8_SURROGATE_LAST)
189      {
190          /**
191          * Surrogates are illegal on their own, we expect the normalizer
192          * to return a replacement char
193          */
194          $utf_expected = UTF8_REPLACEMENT;
195          $hex_expected = utf_to_hexseq($utf_expected);
196      }
197   
198      foreach (array('nfc', 'nfkc', 'nfd', 'nfkd') as $form)
199      {
200          $utf_result = $utf_expected;
201          utf_normalizer::$form($utf_result);
202          $hex_result = utf_to_hexseq($utf_result);
203  //        echo "$form($utf_expected) == $utf_result\n";
204   
205          if (strcmp($utf_expected, $utf_result))
206          {
207              $failed = 1;
208   
209              echo "\nFAILED $hex_expected == $form($hex_tested) ($hex_expected != $hex_result)";
210          }
211      }
212   
213      if ($failed)
214      {
215          die("\n\nFailed at line $n\n");
216      }
217  }
218  fclose($fp);
219   
220  die("\n\nALL TESTS PASSED SUCCESSFULLY\n");
221   
222  /**
223  * Download a file to the develop/ dir
224  *
225  * @param    string    $url        URL of the file to download
226  * @return    void
227  */
228  function download($url)
229  {
230      global $phpbb_root_path;
231   
232      if (file_exists($phpbb_root_path . 'develop/' . basename($url)))
233      {
234          return;
235      }
236   
237      echo 'Downloading from ', $url, ' ';
238   
239      if (!$fpr = fopen($url, 'rb'))
240      {
241          die("Can't download from $url\nPlease download it yourself and put it in the develop/ dir, kthxbai");
242      }
243   
244      if (!$fpw = fopen($phpbb_root_path . 'develop/' . basename($url), 'wb'))
245      {
246          die("Can't open develop/" . basename($url) . " for output... please check your permissions or something");
247      }
248   
249      $i = 0;
250      $chunk = 32768;
251      $done = '';
252   
253      while (!feof($fpr))
254      {
255          $i += fwrite($fpw, fread($fpr, $chunk));
256          echo str_repeat("\x08", strlen($done));
257   
258          $done = ($i >> 10) . ' KiB';
259          echo $done;
260      }
261      fclose($fpr);
262      fclose($fpw);
263   
264      echo "\n";
265  }
266   
267  /**
268  * Convert a UTF string to a sequence of codepoints in hexadecimal
269  *
270  * @param    string    $utf    UTF string
271  * @return    integer            Unicode codepoints in hex
272  */
273  function utf_to_hexseq($str)
274  {
275      $pos = 0;
276      $len = strlen($str);
277      $ret = array();
278   
279      while ($pos < $len)
280      {
281          $c = $str[$pos];
282          switch ($c & "\xF0")
283          {
284              case "\xC0":
285              case "\xD0":
286                  $utf_char = substr($str, $pos, 2);
287                  $pos += 2;
288                  break;
289   
290              case "\xE0":
291                  $utf_char = substr($str, $pos, 3);
292                  $pos += 3;
293                  break;
294   
295              case "\xF0":
296                  $utf_char = substr($str, $pos, 4);
297                  $pos += 4;
298                  break;
299   
300              default:
301                  $utf_char = $c;
302                  ++$pos;
303          }
304   
305          $hex = dechex(utf_to_cp($utf_char));
306   
307          if (!isset($hex[3]))
308          {
309              $hex = substr('000' . $hex, -4);
310          }
311   
312          $ret[] = $hex;
313      }
314   
315      return strtr(implode(' ', $ret), 'abcdef', 'ABCDEF');
316  }
317   
318  /**
319  * Convert a UTF-8 char to its codepoint
320  *
321  * @param    string    $utf_char    UTF-8 char
322  * @return    integer                Unicode codepoint
323  */
324  function utf_to_cp($utf_char)
325  {
326      switch (strlen($utf_char))
327      {
328          case 1:
329              return ord($utf_char);
330   
331          case 2:
332              return ((ord($utf_char[0]) & 0x1F) << 6) | (ord($utf_char[1]) & 0x3F);
333   
334          case 3:
335              return ((ord($utf_char[0]) & 0x0F) << 12) | ((ord($utf_char[1]) & 0x3F) << 6) | (ord($utf_char[2]) & 0x3F);
336   
337          case 4:
338              return ((ord($utf_char[0]) & 0x07) << 18) | ((ord($utf_char[1]) & 0x3F) << 12) | ((ord($utf_char[2]) & 0x3F) << 6) | (ord($utf_char[3]) & 0x3F);
339   
340          default:
341              die('UTF-8 chars can only be 1-4 bytes long');
342      }
343  }
344   
345  /**
346  * Return a UTF string formed from a sequence of codepoints in hexadecimal
347  *
348  * @param    string    $seq        Sequence of codepoints, separated with a space
349  * @return    string                UTF-8 string
350  */
351  function hexseq_to_utf($seq)
352  {
353      return implode('', array_map('hex_to_utf', explode(' ', $seq)));
354  }
355   
356  /**
357  * Convert a codepoint in hexadecimal to a UTF-8 char
358  *
359  * @param    string    $hex        Codepoint, in hexadecimal
360  * @return    string                UTF-8 char
361  */
362  function hex_to_utf($hex)
363  {
364      return cp_to_utf(hexdec($hex));
365  }
366   
367  /**
368  * Convert a codepoint to a UTF-8 char
369  *
370  * @param    integer    $cp            Unicode codepoint
371  * @return    string                UTF-8 string
372  */
373  function cp_to_utf($cp)
374  {
375      if ($cp > 0xFFFF)
376      {
377          return chr(0xF0 | ($cp >> 18)) . chr(0x80 | (($cp >> 12) & 0x3F)) . chr(0x80 | (($cp >> 6) & 0x3F)) . chr(0x80 | ($cp & 0x3F));
378      }
379      else if ($cp > 0x7FF)
380      {
381          return chr(0xE0 | ($cp >> 12)) . chr(0x80 | (($cp >> 6) & 0x3F)) . chr(0x80 | ($cp & 0x3F));
382      }
383      else if ($cp > 0x7F)
384      {
385          return chr(0xC0 | ($cp >> 6)) . chr(0x80 | ($cp & 0x3F));
386      }
387      else
388      {
389          return chr($cp);
390      }
391  }