69 tecken kort UTF-8-kodare i C

Per von Zweigbergk pvz at kth.se
Sat Jun 30 17:36:08 CEST 2007


30 jun 2007 kl. 16.20 skrev David Vuorio:

> Per von Zweigbergk wrote:
>> 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);}
>
> Den är buggig, se min kommentar i tråden och en patch nedan. ;-)
>
> /David
>
> --- conv.c      2007-06-30 16:19:24.000000000 +0200
> +++ conv2.c     2007-06-30 16:19:14.000000000 +0200
> @@ -1 +1 @@
> -main(c){for(;c=~getchar();c|=64,putchar(~c))c&128?:putchar(c>>6^63);}
> +main(c){for(;c=~getchar();c|=64,putchar(~c))c&128?:putchar(c>>6^63);}

Min ursprungliga version fungerade alltså inte universellt eftersom  
den förlitade sig på evalueringsordningen av argument i C, vilket man  
inte kan göra. Att sedan multipla argument till putchar orsakas också  
av samma trick.

Patchen fungerar inte, eftersom c|=64 måste köras endast om c&128 är  
falskt.

Denna bör dock fungera:

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

Den är dock 2 tecken längre än ursprunget på grund av en extra nivå  
paranteser. Men att den är någolunda portabel och faktiskt fungerar  
är ju alltid en fördel. :-)



More information about the Stacken mailing list