Unicode Character Finder

Hosted by the Department of Linguistics at the University of Pennsylvania.

Search by Character name:
"/>
Other Links:
IPA Clickable Chart
'Letter, Uppercase', "Ll" => 'Letter, Lowercase', "Lt" => 'Letter, Titlecase', "Lm" => 'Letter, Modifier', "Lo" => 'Letter, Other', "Me" => 'Mark, Enclosing', "Mc" => 'Mark, Spacing Combining', #"Mn" => 'Mark, Nonspacing', # Don't display these since they don't show up "Nd" => 'Number, Decimal Digit', "Nl" => 'Number, Letter', "No" => 'Number, Other', "Pc" => 'Punctuation, Connector', "Pd" => 'Punctuation, Dash', "Ps" => 'Punctuation, Open', "Pe" => 'Punctuation, Close', "Pi" => 'Punctuation, Initial quote', "Pf" => 'Punctuation, Final quote', "Po" => 'Punctuation, Other', "Sc" => 'Symbol, Currency', "Sm" => 'Symbol, Math', "Sk" => 'Symbol, Modifier', "So" => 'Symbol, Other', "Zs" => 'Separator, Space', "Zl" => 'Separator, Line', "Zp" => 'Separator, Paragraph', "Cc" => 'Other, Control', "Cf" => 'Other, Format', "Cs" => 'Other, Surrogate', "Co" => 'Other, Private Use' ); $category_names = array_keys($categories); function PrintCharacters() { } $search_terms = explode(" ", $_REQUEST['search']); $search_block = explode("-", $_REQUEST['block']); if ($_REQUEST['search'] == "" && $search_block[1] == "" && $search_block[2] == "") { $fh = fopen("Blocks.txt", 'r') or die("Can't open file unicode blocks file Blocks.txt."); while (!feof($fh)) { $line = fgets($fh, 4096); if (ereg("^([^#].+)\.\.(.+); (.+)", $line, $reg)) { $blocks[$reg[3]] = $reg[1] . "-" . $reg[2]; } } fclose($fh); ksort($blocks); $blocknames = array_keys($blocks); echo "

Browse by Unicode Block

\n"; echo "
\n"; for ($i = 0; $i < count($blocknames); $i++) { echo "
" . $blocknames[$i] . "
\n"; if (($i % 40) == 40-1) { echo "
    "; } } echo "
\n"; } else { $ctr = 0; $fh = fopen("UnicodeData.txt", 'r') or die("Can't open file unicode data file UnicodeData.txt."); while (!feof($fh)) { $line = fgets($fh, 4096); $data = explode(";", $line); $num = $data[0]; $name = $data[1]; $cat = $data[2]; $ccc = $data[3]; $bc = $data[4]; $cdm = $data[5]; $ddv = $data[6]; $dv = $data[7]; $nv = $data[8]; $mirrored = $data[9]; $uni1name = $data[10]; $isocomment = $data[11]; $uchar = $data[12]; $lchar = $data[13]; $tchar = $data[14]; if ($isocomment != "") { $name = $name . " (" . $isocomment . ")"; } # use "x" to force string-wise comparison, since these numbers are in hex if ($search_block[0] != "" && ("x".$num < "x".$search_block[0] || "x".$num > "x".$search_block[1])) { continue; } $matches = 1; $exact = 1; for ($i = 0; $i < count($search_terms); $i++) { if ($search_terms[$i] != "" && !eregi("(^| )" . $search_terms[$i], $name)) { $matches = 0; break; } if ($search_terms[$i] != "" && !eregi("(^| )" . $search_terms[$i] . "($| )", $name)) { $exact = 0; } } if (!$matches) { continue; } $chars[$exact][$cat][] = array(num => $num, name => $name); $ctr++; if ($ctr > 1000) { break; } } fclose($fh); echo "

Character Grid

"; echo "

Double-click a character to select it. Then copy it to the clipboard with, for instance, CTRL+C. Hover the mouse over a character to see its name and numeric code.

"; for ($exact = 1; $exact >= 0; $exact--) { if (count($chars[$exact]) == 0) { continue; } if (count($chars[0]) != 0 && count($chars[1]) != 0) { if ($exact == 1) { echo "

Best Matches

"; } if ($exact == 0) { echo "

Other Matches

"; } } echo ""; $col = 0; $width = 25; for ($i = 0; $i < count($category_names); $i++) { $charlist = $chars[$exact][$category_names[$i]]; if (count($charlist) == 0) { continue; } $catname = $categories[$category_names[$i]]; $nw = floor(strlen($catname)/10) + 1; if ($col + $nw >= $width) { echo "\n\n"; $col = 0; } echo "\n"; $col += $nw; for ($j = 0; $j < count($charlist); $j++) { if ($col >= $width) { echo "\n\n"; $col = 0; } echo "\n"; $col++; } } echo "
" . $catname . "
"; echo "&#x" . $charlist[$j]['num'] . ";"; echo "
\n"; } } ?>