Discover all the glyphs of Unicode 8.0 in this super-long slideshow. Best viewed on Firefox.
for(_='inRStrRgQ]+0|0PstyleZ"+YvalXi-65536W0<W?(WV="0xYw[rharCode,j,h,mvh arial;+"g0,g0,k,icenterZfont:4.toQ(16),n<button onclick=i= ,l,setInterX(s,v.Xue).RnerHTML+++P>U+(1E4+i.toUpperCase()).slice((0>W)-5)b.color:#fff;background:hsl(Y(i/9-200),50%,50%)";x=w8,s,ojl,p88,q,ojg,p,r,tgg9c2094,tbbh10h0b,o,unhhkkiog8njihjhhjkkRg6hg8niilpnhkijg6lgcjk0j0,spbj3udh8h18h4li,oi7pj06q0pg35qlnj0bs5tk2i0l0p6eh4,t69h95h2q05ennu".replace(/[g-u]/g,function(a){return",Y(a.cAt()-102)}).split(",");s=\'\\\'< 5vh/85height:85vh">\\\'+Q.fromC(V>>10)+55296:i,V)%1024+56320:0)</;i++;if(++q=P)r++,q=0\';b< id=x>";i=q=r=0;"<h1>UN1kODE</h1> 0,r=0>GO!";for(x+<p>Speed <Rput id=v Xue=99 size=1>";r<512;)x+=[["<br>"][r%16]] Yi,r+r Z=width:7em';g=/[-V-ZP-R]/.exec(_);)with(_.split(g))_=join(shift());eval(_)
Zm9yKF89J2luUlN0clJnUV0rMHwwUHN0eWxlWiIrWXZhbFhpLTY1NTM2VzA8Vz8oV1Y9Ih8fMHhZd1tyHmhhckNvZGUdLGocLGgbHBsaLG0ZdmggYXJpYWw7GCsiF2cwFixnFRUwFBQUEyxrEixpERIREGNlbnRlcg9aH2ZvbnQ6NA4udG9RKDE2KQwsbgs8YnV0dG9uIG9uY2xpY2s9aT0JLGwICBsHLHNldEludGVyWChzLHYuWHVlKQYuUm5lckhUTUwFCwsEESseKytQAz5VFysoMUU0K2kMLnRvVXBwZXJDYXNlKCkpLnNsaWNlKCgwPlcpLTUpAmIuDhhjb2xvcjojZmZmO2JhY2tncm91bmQ6aHNsKFkoaS85LTIwMCkXLDUwJSw1MCUpIjt4BT0Bdx84BCxzCBIZLG8UEQgZFBAcHBpqbAQEBAQEBBQscAgUFTgbBzgbBxsbGwsscRIQBxssbxILHBwQamcRCxwcExkRERESHBkTGixwCxsIFCxyERUUBBMHCxESBwQsdGdnHAgIEQgVGxEVExU5YxwSMjAcORwRFTQIByx0ERUcBxERGwcHBxEcEhpiYhJoMTBoMBIbYhUVFRsbLG8sdRUEHBIcEW5oGhEbERscaGsREWtpHG9nOG5qGxsRaWgbG2poCAcbaGoaGxFra1JnNmhnOG4QEAcSaWkSCxZscG4IaGtpamc2bGdjamswajALLHNwYmozdWRoOGgxOGg0EWxpLG9pN3BqMDYWcTBwFWczNRYUEnFsG25qMBticzV0azIWFmkZCBMRMBAECxNsMHA2ZWgWNCx0FTY5aDk1aDJxMDVlbm51Ii5yZXBsYWNlKC9bZy11XS9nLGZ1bmN0aW9uKGEpe3JldHVybiIsWShhLmMdQXQoKS0xMDIpDH0pLnNwbGl0KCIsIik7cz1cJwFcXFwnPA8gDjV2aC84NRhoZWlnaHQ6ODV2aCI+XFxcJytRLmZyb21DHShWPj4xMCkrNTUyOTY6aSxWKSUxMDI0KzU2MzIwOjApFzwvDwI7aSsrO2lmKCsrcT0eUClyKysDLHE9MFwnO2IFHzwPIGlkPXg+IjtpPXE9cj0wOwEiPGgxPlVOMWtPREU8L2gxPgkwLHI9MAY+R08hIjtmb3IoeAUrHzxwPlNwZWVkIDxScHV0IGlkPXYgWHVlPTk5IHNpemU9MT4iO3I8NTEyOyl4BSs9W1siPGJyPiJdW3IlMTZdXRcJWWkXLHIfK3IXBiBaPXdpZHRoOjdlbQIDAyc7Zz0vWwEtH1YtWlAtUl0vLmV4ZWMoXyk7KXdpdGgoXy5zcGxpdChnKSlfPWpvaW4oc2hpZnQoKSk7ZXZhbChfKQ==
// ==============
// Introduction
// ==============
// This demo shows of all the Unicode 8.0 assigned glyph and code points, with varying background color and customizable speed and a starting point from the 256 different blocks
// The demo features 119,792 glyphs and lengths about ~3h20 @ 10 glyphs per second
// Private use blocks and surrogate blocks are ignored.
// The following code contains a lot of repetitions in order to optimize RegPack's compression
// ======
// Data
// ======
// The following array corresponds to the lengths of the assigned and unassigned intervals in Unicode 8.0, alternativaly.
// w = "0x80, 0x0, 0x80, 0x0, 0x80, 0x0, 0xd0, 0x0, 0x60, 0x0, 0x50, 0x0, 0x70, 0x0, 0x90, 0x0, 0x100, 0x0, 0x30, 0x0, 0x60, 0x0, 0x70, 0x0, 0x100, 0x0, 0x50, 0x0, 0x30, 0x0, 0x40, 0x0, 0x40, 0x0, 0x40, 0x0, 0x20, 0x40, 0x60, 0x0, 0x80, 0x0, 0x80, 0x0, 0x80, 0x0, 0x80, 0x0, 0x80, 0x0, 0x80, 0x0, 0x80, 0x0, 0x80, 0x0, 0x80, 0x0, 0x80, 0x0, 0x80, 0x0, 0x80, 0x0, 0x100, 0x0, 0xa0, 0x0, 0x60, 0x0, 0x100, 0x0, 0x180, 0x0, 0x20, 0x0, 0x60, 0x0, 0x280, 0x0, 0x20, 0x0, 0x60, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x80, 0x0, 0xb0, 0x0, 0x50, 0x0, 0x50, 0x0, 0x30, 0x0, 0x60, 0x0, 0x20, 0x0, 0x20, 0x0, 0x90, 0x0, 0x50, 0x0, 0x80, 0x0, 0x40, 0x0, 0x40, 0x0, 0x50, 0x0, 0x30, 0x40, 0x10, 0x0, 0x30, 0x0, 0x80, 0x0, 0x40, 0x0, 0x40, 0x0, 0x100, 0x0, 0x100, 0x0, 0x70, 0x0, 0x30, 0x0, 0x30, 0x0, 0x30, 0x0, 0x50, 0x0, 0x40, 0x0, 0x70, 0x0, 0x100, 0x0, 0x100, 0x0, 0x40, 0x0, 0x20, 0x0, 0xa0, 0x0, 0x80, 0x0, 0x20, 0x0, 0x60, 0x0, 0x100, 0x0, 0xc0, 0x0, 0x30, 0x0, 0x10, 0x0, 0x100, 0x0, 0x80, 0x0, 0x80, 0x0, 0x100, 0x0, 0x100, 0x0, 0x60, 0x0, 0x20, 0x0, 0x80, 0x0, 0x30, 0x0, 0x50, 0x0, 0x60, 0x0, 0x20, 0x0, 0x80, 0x0, 0x80, 0x0, 0xe0, 0x10, 0x10, 0x0, 0x40, 0x0, 0x60, 0x0, 0x60, 0x0, 0x30, 0x0, 0x60, 0x0, 0x10, 0x0, 0x20, 0x0, 0x30, 0x0, 0x10, 0x0, 0x100, 0x0, 0x100, 0x0, 0x19c0, 0x0, 0x40, 0x0, 0x5200, 0x0, 0x490, 0x0, 0x40, 0x0, 0x30, 0x0, 0x140, 0x0, 0x60, 0x0, 0x60, 0x0, 0x20, 0x0, 0xe0, 0x0, 0x30, 0x0, 0x10, 0x0, 0x40, 0x0, 0x60, 0x0, 0x20, 0x0, 0x30, 0x0, 0x30, 0x0, 0x20, 0x0, 0x60, 0x0, 0x20, 0x0, 0x60, 0x0, 0x20, 0x0, 0x60, 0x0, 0x20, 0x0, 0x30, 0x0, 0x40, 0x0, 0x50, 0x0, 0x40, 0x0, 0x2bb0, 0x0, 0x50, 0x2100, 0x200, 0x0, 0x50, 0x0, 0x2b0, 0x0, 0x10, 0x0, 0x10, 0x0, 0x10, 0x0, 0x20, 0x0, 0x20, 0x0, 0x90, 0x0, 0xf0, 0x0, 0x10, 0x0, 0x80, 0x0, 0x80, 0x0, 0x40, 0x0, 0x50, 0x0, 0x40, 0x0, 0x30, 0x80, 0x20, 0x0, 0x40, 0x0, 0x20, 0x0, 0x30, 0x0, 0x20, 0x0, 0x30, 0x0, 0x20, 0x0, 0x40, 0x20, 0x50, 0x0, 0x30, 0x0, 0x30, 0x50, 0x30, 0x0, 0x40, 0x90, 0x180, 0x80, 0x40, 0x0, 0x20, 0x0, 0x20, 0x0, 0x30, 0x30, 0x20, 0x0, 0x20, 0x0, 0x20, 0x40, 0x20, 0x0, 0x60, 0x0, 0x60, 0x0, 0x20, 0x0, 0x20, 0x20, 0x40, 0x0, 0x40, 0x0, 0x20, 0x0, 0x20, 0x0, 0x30, 0x50, 0x50, 0x30, 0x80, 0x160, 0x20, 0x180, 0x80, 0x0, 0x50, 0x0, 0x30, 0x0, 0x50, 0x0, 0x30, 0x0, 0x60, 0x0, 0x20, 0x0, 0x50, 0x30, 0x30, 0x0, 0x50, 0x0, 0x80, 0x100, 0x60, 0xa0, 0x80, 0x0, 0x60, 0x20, 0x50, 0x30, 0x40, 0x160, 0x60, 0x1c0, 0x40, 0x500, 0x400, 0x0, 0x80, 0x0, 0xd0, 0xab0, 0x430, 0xfd0, 0x280, 0x2180, 0x240, 0x0, 0x30, 0x60, 0x30, 0x0, 0x90, 0x370, 0xa0, 0x4060, 0x100, 0xb00, 0xa0, 0x0, 0x10, 0x1350, 0x100, 0x0, 0x100, 0x0, 0x50, 0xb0, 0x60, 0x0, 0x20, 0x80, 0x400, 0x0, 0x2b0, 0xd50, 0xe0, 0x520, 0x100, 0x100, 0x30, 0x0, 0x70, 0x0, 0x60, 0x0, 0x100, 0x0, 0x100, 0x0, 0x300, 0x0, 0x50, 0x0, 0x30, 0x0, 0x80, 0x0, 0x80, 0x0, 0x80, 0x0, 0x100, 0x0, 0x100, 0x600, 0xa6e0, 0x20, 0x1040, 0x0, 0xe0, 0x0, 0x1690, 0x2950, 0x220, 0xb05e0, 0x80, 0x80, 0xf0]
// i.e: there's a range of 0x80 assigned code points (0x0 - 0x7F), then 0 unassigned code points, then a range 0x80 assigned code points (0x80 - 0xFF), etc.
// It's based on this data: http://www.unicode.org/Public/UNIDATA/Blocks.txt
// To see how it was generated and golfed, read this: https://github.com/xem/miniUnicode/blob/gh-pages/3-ranges.html
// Here it is in its golfed form:
w="8,N,N,S,L,K,M,O,G0,I,L,M,G0,K,I,J,J,J,HJL,N,N,N,N,N,N,N,N,N,N,N,N,G0,P,L,G0,G8,H,L,H8,H,L,H,H,H,H,N,Q,K,K,I,L,H,H,O,K,N,J,J,K,IJG,I,N,J,J,G0,G0,M,I,I,I,K,J,M,G0,G0,J,H,P,N,H,L,G0,R,I,G,G0,N,N,G0,G0,L,H,N,I,K,L,H,N,N,TGG,J,L,L,I,L,G,H,I,G,G0,G0,G9c,J,K20,J9,J,I,G4,L,L,H,T,I,G,J,L,H,I,I,H,L,H,L,H,L,H,I,J,K,J,Hbb,KH10H0,K,Hb,G,G,G,H,H,O,U,G,N,N,J,K,J,INH,J,H,I,H,I,H,JHK,I,IKI,JOG8NJ,H,H,IIH,H,HJH,L,L,H,HHJ,J,H,H,IKKING6HG8N,K,I,K,I,L,H,KII,K,NG0LPN,LHKIJG6LGcJK0J0,N,SPbJ3UdH8H18H4,ILI,OI7PJ06G0Q0P,GG35G0,G0,KQL,HNJ0,HbS5TK2G0G0I,M,L,G0,G0,I0,K,I,N,N,N,G0,G0L0P6eHG04,T,G69H95H2Q05eNNU".replace(/[G-U]/g,function(a){return "," + (a.charCodeAt()-70).toString(16)}).split(",");
// Now, w contains a list of strings corresponding to each value of the array above, without the leading "0x" and the trailing "0".
// Ex: ["8",,"8",,"8",,"d",...]
// ===============
// Loop function
// ===============
s = function(){
// Set the style of <body>, with a background color changing very slightly at each frame, starting at hsl(200,50%,50%) and looping infinitely through all the hue spectrum.
b.style = "font:4vh arial;color:#fff;background:hsl(" + (i / 9 - 200) + ",50%,50%)";
// Rewrite the page's content:
// HTML/CSS for the current glyph
x.innerHTML = '<center style="font:45vh/85vh arial;height:85vh">'
// Current glyph:
// - if z is negative, we're in the BMP (U+0 - U+FFFF) and we can just call String.fromCharCode(i,0)
// - if z is positive, we're on an astral plane (U+10000 - U+10FFFF) and we need to call String.fromCharCode with a surrogate pair: ((z>>10)+0xD800, z%0x400+0xDC00)
+ String.fromCharCode(
0 < i -65536 ? (i - 65536 >> 10) + 55296 : i,
0 < i -65536 ? (i - 65536) % 1024 + 56320 : 0
)
// HTML for the current code point, uppercased and zero-padded up to 4 characters
+ "</center>U+" + (1E4 + i.toString(16).toUpperCase()).slice((0 > i - 65536) - 5);
// Next code point (increment i and q)
i++;
// If q corresponds to the current block length reconverted into a hex number (ex: if the current value in w is "86", test if q == 0x860)
if(++q == "0x" + w[r] + 0 | 0){
// Pass to the next value of w (the next unassigned code points range length)
r++;
// Increment i with this value, and pass to the next value of w (the next assigned range length)
i += "0x" + w[r++] + 0 | 0;
// Reset q
q = 0;
}
}
// ================
// Welcome screen
// ================
// Write a <center> element that will contain the rest of the HTML
b.innerHTML = "<center id=x>";
// Initialize code point, code point index in the current range, and the current range index in w.
i = q = r = 0;
// Set the style of the body
b.style = "font:4vh arial;color:#fff;background:hsl(" + (i / 9 - 200) + ",50%,50%)";
// Write the title and the main button
x.innerHTML = "<h1>UN1kODE</h1><button onclick=i=0,r=0,setInterval(s,v.value)>GO!";
// Write a speed input and a button for each of the 256 blocks, in lines of 8 buttons
for(x.innerHTML += "<p>Speed <input id=v value=99 size=1>"; r < 512; ){
x.innerHTML += [["<br>"][r%16]] + "<button onclick=i=" + i + ",r=" + r + ",setInterval(s,v.value) style=width:7em>U+" + (1E4 + i.toString(16).toUpperCase()).slice((0 > i - 65536) - 5);
i += "0x" + w[r++] + 0 | 0;
i += "0x" + w[r++] + 0 | 0;
}
// ==============
// Minification
// ==============
// After closure compiler and hand-optimizations (mainly, removing CC's line breaks and transforming the loop function into a string):
// w="8,n,n,s,l,k,m,o,g0,i,l,m,g0,k,i,j,j,j,hjl,n,n,n,n,n,n,n,n,n,n,n,n,g0,p,l,g0,g8,h,l,h8,h,l,h,h,h,h,n,q,k,k,i,l,h,h,o,k,n,j,j,k,ijg,i,n,j,j,g0,g0,m,i,i,i,k,j,m,g0,g0,j,h,p,n,h,l,g0,r,i,g,g0,n,n,g0,g0,l,h,n,i,k,l,h,n,n,tgg,j,l,l,i,l,g,h,i,g,g0,g0,g9c,j,k20,j9,j,i,g4,l,l,h,t,i,g,j,l,h,i,i,h,l,h,l,h,l,h,i,j,k,j,hbb,kh10h0,k,hb,g,g,g,h,h,o,u,g,n,n,j,k,j,inh,j,h,i,h,i,h,jhk,i,iki,jog8nj,h,h,iih,h,hjh,l,l,h,hhj,j,h,h,ikking6hg8n,k,i,k,i,l,h,kii,k,ng0lpn,lhkijg6lgcjk0j0,n,spbj3udh8h18h4,ili,oi7pj06g0q0p,gg35g0,g0,kql,hnj0,hbs5tk2g0g0i,m,l,g0,g0,i0,k,i,n,n,n,g0,g0l0p6ehg04,t,g69h95h2q05ennu".replace(/[g-u]/g,function(a){return","+(a.charCodeAt()-102).toString(16)}).split(",");s='b.style="font:4vh arial;color:#fff;background:hsl("+(i/9-200)+",50%,50%)";x.innerHTML=\'<center style="font:45vh/85vh arial;height:85vh">\'+String.fromCharCode(0<i-65536?(i-65536>>10)+55296:i,0<i-65536?(i-65536)%1024+56320:0)+"</center>U+"+(1E4+i.toString(16).toUpperCase()).slice((0>i-65536)-5);i++;if(++q=="0x"+w[r]+0|0)r++,i+="0x"+w[r++]+0|0,q=0';b.innerHTML="<center id=x>";i=q=r=0;b.style="font:4vh arial;color:#fff;background:hsl("+(i/9-200)+",50%,50%)";x.innerHTML="<h1>UN1kODE</h1><button onclick=i=0,r=0,setInterval(s,v.value)>GO!";for(x.innerHTML+="<p>Speed <input id=v value=99 size=1>";r<512;)x.innerHTML+=[["<br>"][r%16]]+"<button onclick=i="+i+",r="+r+",setInterval(s,v.value) style=width:7em>U+"+(1E4+i.toString(16).toUpperCase()).slice((0>i-65536)-5),i+="0x"+w[r++]+0|0,i+="0x"+w[r++]+0|0
// =========
// Packing
// =========
// Passed through RegPack with the following params:
// - Don't assume c is a canvas
// - Don't reassign var names
// - Score = 10, 0, 10
// Output: 1024b
// <3
// PS: thanks to Subzey for helping me save a few final bytes!