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