69 tecken kort UTF-8-kodare i C

Per von Zweigbergk pvz at pvz.pp.se
Sat Jun 30 02:49:06 CEST 2007


Jag slogs för någon timme eller två sedan av en tanke. En riktigt  
kort version av en kodare från ISO-8859-1 till UTF-8.

main(c){for(;c=~getchar();putchar(~c))c&128?:putchar(c>>6^63,c|=64);}

Som det är nu, 69 tecken lång. kakos på #xkcd på irc.xkcd.com ska ha  
cred för att ha tagit bort några tecken.

Om man ska vara noga är det här kanske inte riktigt äkta C. Den  
använder en GNU-extention -- ?: utan andra argument. Inte säker om  
denna finns i exempelvis C99. Och det finns en massa andra  
oegentligheter som får en purist att skrika. :-)

Jag vill utmana mailinglistan, alltså, för att se om någon av er  
känner till några fula knep för att göra den här ännu kortare,  
alternativt kommer på någon fin alternativ implementation som är  
kortare. (Diskvalifikation på lustigheter som t.ex. system(), eller  
iconv() ;-) )

För den intresserade har jag bifogat en beskrivning av hur den  
fungerar, kodad som ROT13 ifall någon vill försöka klura ut detta på  
egen hand får göra det. :-)

För övrigt är den kortaste ROT13-koder/dekodern jag känner till  
följande:

main(a){while(a=~getchar())putchar(~a-1/(~(a|32)/13*2-11)*13);}

Den är skriven av Michael Schroeder (mlschroe at faui43.informatik.uni- 
erlangen.de), tagen från http://hea-www.harvard.edu/~fine/Tech/ 
rot13.html

--- ROT13 BÖRJAR ---
Qrg xnafxr zäexf ngg wnt oyvivg vafcverenq ni binafgåraqr ebg13- 
rkrzcry -- fcrpvryyg fäggrg ngg ågrenaiäaqn netp fbz ra vag cå  
fgnpxra, bpu qra evxgvtg falttn rbs-xbyyra. (Bz zna gne xbzcyrzragrg  
gvyy rbs, fbz äe -1, få såe zna wh 0.)

Qrg raqn qrg uäe cebtenzzrg töe rtragyvtra äe ngg xbqn hgs-8,  
gntnaqrf grpxra seåa fgqva fbz xbqchaxgre. Qr söefgn 256 xbqchaxgrean  
v HGS-8 zngpune aäzyvtra Yngva-1. :-)

Qrg uryn oyve vagr fäzer ni ngg wnt oruöire ~p v naqen fgäyyra v  
xbqra. p&128 rkrzcryivf xbyyne vsnyy qra åggbaqr ovgra äe uöt --  
ryyre ngg grpxarg fbz yäfgrf va unqr ra yåt åggbaqr ovg, qif ngg qrg  
äe yäter äa 128. Ivyxrg äe cenxgvfxg vbz ngg wnt ivyy töen fnxre aäe  
qrg äe snyfxg, fbz yågre zvt fcnen rgg grpxra.

Qrg äe giå nethzrag gvyy chgpune (zvffoehx ni fgnpxra, wnivffg), qrg  
äe vagr ra xbzzn-bcrengbe. Söefgn nethzragrg gne qr giå zrfg  
fvtavsvxnagn ovgnean, bpu frqna kbe zrq ra geriyvt ovgznfx fyåe giå  
syhtbe v ra fzäyy -- vairegrene ovgnean gvyy eägg "cbynevgrg" vtra,  
bpu fre gvyy ngg qra söefgn olgra v frxirafra oöewne zrq 1100 00kk  
fbz qra fxn. Bz zna äe vagerffrenq ni ngg fgöqwn zhygvcyn xbqavatne,  
oöe qrg tå ngg svccyn zrq xbafgnagra 63. Qrg naqen nethzragrg, fbz  
nyqevt naiäaqf söe fvgg erfhygng, hgna raqnfg söe fva fvqrssrxg äe  
söe ngg äaqen p söer xbagebyyra tåe gvyy chgpune(~p) (v sbe-fngfra).  
Qrggn äe söe ngg fäggn fwhaqr ovgra uöt. Rsgrefbz iv irg ngg åggbaqr  
ovgra zåfgr inen yåt fre qå p hg fbz 01kk kkkk, qäe k äe qr k zvafg  
fvtavsvxnagn ovgnean, v sry cbynevgrg. Ivq chgpune(~p) iäaqf nyyg  
eägg vtra. Nygreangvig fxevire qra onen hg rgg bzbyrfgreng grpxra  
vsnyy zna nyqevt xbz va v grfgrg.

Cå få fägg fxevire qra hg 0kkk kkkk qäe p < 128, bpu 1100 00kk 10kk  
kkkk bz p >= 128. :-)
--- ROT13 SLUTAR ---



More information about the Stacken mailing list