<?php
  if(isset($_GET['src']))
  {
    header('Content-type: text/text');
    exit(file_get_contents(__FILE__));
  }
  require('lib/template.php');
  $template_vars['title'] = 'Facebook Unicode Generator';
  if(!isset($_GET['text'])) $_GET['text'] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\nabcdefghijklmnopqrstuvwxyz\n0123456789";
  if(!isset($_GET['family'])) $_GET['family'] = 'script';
?>
<form action="unicode.php">
<textarea rows="10" cols="80" name="text"><?php echo $_GET['text']; ?></textarea><br/>
<select name="family">
<?php

  $font['bold'] = build_unicode_range('A', 'Z', 0x1D400);
  $font['bold'] = build_unicode_range('a', 'z', 0x1D41A, $font['bold']);
  $font['bold'] = build_unicode_range('0', '9', 0x1D7CE, $font['bold']);

  $font['bold italic'] = build_unicode_range('A', 'Z', 0x1D468);
  $font['bold italic'] = build_unicode_range('a', 'z', 0x1D482, $font['bold italic']);
  $font['bold italic'] = build_unicode_range('0', '9', 0x1D7CE, $font['bold italic']);

  $font['bold script'] = build_unicode_range('A', 'Z', 0x1D4D0);
  $font['bold script'] = build_unicode_range('a', 'z', 0x1D4EA, $font['bold script']);

  $font['circled'] = build_unicode_range('A', 'Z', 0x24B6, ['0'=>'⓪']);
  $font['circled'] = build_unicode_range('a', 'z', 0x24D0, $font['circled']);
  $font['circled'] = build_unicode_range('0', '9', 0x245F, $font['circled']);

  $font['dark circled'] = build_unicode_range('A', 'Z', 0x1F150, ['0'=>'⓿']);
  $font['dark circled'] = build_unicode_range('a', 'z', 0x24D0, $font['dark circled']);
  $font['dark circled'] = build_unicode_range('0', '9', 0x278A, $font['dark circled']);

  $font['double'] = build_unicode_range('A', 'Z', 0x1D538, ['C'=>'ℂ','H'=>'ℍ','N'=>'ℕ','P'=>'ℙ','Q'=>'ℚ','R'=>'ℝ','Z'=>'ℤ']);
  $font['double'] = build_unicode_range('a', 'z', 0x1D552, $font['double']);
  $font['double'] = build_unicode_range('0', '9', 0x1D7D8, $font['double']);

  $font['fraktur'] = build_unicode_range('A', 'Z', 0x1D504);
  $font['fraktur'] = build_unicode_range('a', 'z', 0x1D51E, $font['fraktur']);

  $font['fraktur bold'] = build_unicode_range('A', 'Z', 0x1D56C);
  $font['fraktur bold'] = build_unicode_range('a', 'z', 0x1D586, $font['fraktur bold']);

  $font['italic'] = build_unicode_range('A', 'Z', 0x1D434, ['h'=>'ℎ']);
  $font['italic'] = build_unicode_range('a', 'z', 0x1D44E, $font['italic']);

  $font['mono'] = build_unicode_range('A', 'Z', 0x1D670);
  $font['mono'] = build_unicode_range('a', 'z', 0x1D68A, $font['mono']);
  $font['mono'] = build_unicode_range('0', '9', 0x1D7F6, $font['mono']);

  $font['sans'] = build_unicode_range('A', 'Z', 0x1D5A0);
  $font['sans'] = build_unicode_range('a', 'z', 0x1D5BA, $font['sans']);

  $font['sans bold'] = build_unicode_range('A', 'Z', 0x1D5D4);
  $font['sans bold'] = build_unicode_range('a', 'z', 0x1D5EE, $font['sans bold']);
  $font['sans bold'] = build_unicode_range('0', '9', 0x1D7EC, $font['sans bold']);

  $font['sans bold italic'] = build_unicode_range('A', 'Z', 0x1D63C);
  $font['sans bold italic'] = build_unicode_range('a', 'z', 0x1D656, $font['sans bold italic']);
  $font['sans bold italic'] = build_unicode_range('0', '9', 0x1D7CE, $font['sans bold italic']);

  $font['sans italic'] = build_unicode_range('A', 'Z', 0x1D608);
  $font['sans italic'] = build_unicode_range('a', 'z', 0x1D622, $font['sans italic']);

  $font['script'] = build_unicode_range('A', 'Z', 0x1D49C, ['B'=>'ℬ','E'=>'ℰ','F'=>'ℱ','H'=>'ℋ','I'=>'ℐ','L'=>'ℒ','M'=>'ℳ','R'=>'ℛ','e'=>'ℯ','g'=>'ℊ','o'=>'ℴ']);
  $font['script'] = build_unicode_range('a', 'z', 0x1D4B6, $font['script']);

  $font['script bold'] = build_unicode_range('A', 'Z', 0x1D4D0);
  $font['script bold'] = build_unicode_range('a', 'z', 0x1D4EA, $font['script bold']);

  $font['squared'] = build_unicode_range('A', 'Z', 0x1F130);
  $font['squared'] = build_unicode_range('a', 'z', 0x1F130, $font['squared']);

  $font['squared dark'] = build_unicode_range('A', 'Z', 0x1F170);
  $font['squared dark'] = build_unicode_range('a', 'z', 0x1F170, $font['squared dark']);

  $font['upsidedown'] =
  [
    '!'=>'¡','"'=>'„','&'=>'⅋',"'"=>',','('=>')',')'=>'(','.'=>'˙','1'=>'I','2'=>'ᄅ','3'=>'Ɛ','4'=>'ᔭ','5'=>'ϛ','6'=>'9','7'=>'Ɫ',';'=>'؛','<'=>'>','>'=>'<','?'=>'¿','['=>']','['=>']','_'=>'‾',
    'A'=>'∀','B'=>'𐐒','C'=>'Ↄ','D'=>'◖','E'=>'Ǝ','F'=>'Ⅎ','G'=>'⅁','J'=>'ſ','K'=>'⋊','L'=>'⅂','M'=>'W','P'=>'Ԁ','Q'=>'Ό','R'=>'ᴚ','T'=>'⊥','U'=>'∩','V'=>'ᴧ','Y'=>'⅄',
    'a'=>'ɐ','b'=>'q','c'=>'ɔ','d'=>'p','e'=>'ǝ','f'=>'ɟ','g'=>'ƃ','h'=>'ɥ','i'=>'ı','j'=>'ɾ','k'=>'ʞ','l'=>'ʃ','m'=>'ɯ','n'=>'u','r'=>'ɹ','t'=>'ʇ','u'=>'n','v'=>'ʌ','w'=>'ʍ','y'=>'ʎ',
    '{'=>'}','{'=>'}'
  ];

  function build_unicode_range($from_start, $from_end, $to_start, $ret=[])
  {
    for($f = $from_start; $f <= $from_end; $f = chr(ord($f)+1))
    {
      if(!isset($ret[$f])) $ret[$f] = mb_chr($to_start);
      $to_start++;
    }
    return $ret;
  }

  foreach($font as $family=>$map)
  {
    echo "<option value=\"$family\"";
    if($family == $_GET['family']) echo ' selected="selected"';
    echo ">$family</option>\n";
  }
?>
<option value="strike"<?php if($_GET['family'] == 'strike') echo ' selected="selected"'; ?>>strike</option>
<option value="solidus"<?php if($_GET['family'] == 'solidus') echo ' selected="selected"'; ?>>solidus</option>
</select>

<input type="submit">
</form>
Copy this and paste into facebook:<br/><br/>
<?php
  $text = $_GET['text'];
  if($_GET['family'] == 'strike')
  {
    $text = chunk_split($text, 1, chr(0xcc).chr(0xb6)) . chr(0xcc) . chr(0xb6);
  }
  elseif($_GET['family'] == 'solidus')
  {
    $text = chunk_split($text, 1, chr(0xcc).chr(0xb7)) . chr(0xcc) . chr(0xb7);
  }
  else
  {
    $orig = $text;
    if($_GET['family'] == 'upsidedown') $orig = strrev($orig);
    $text = '';
    $f = $font[$_GET['family']];
    for($i = 0; $i < strlen($orig); $i++)
    {
      $text .= isset($f[$orig[$i]]) ? $f[$orig[$i]] : $orig[$i];
    }
  }
  echo '<font size="5">' . nl2br($text) . '</font>';
?><br><br><br>
<div style="float:right"><a href="unicode.php?src=1">Source Code</a></div>
</body>
</html>
