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