- 113 名前:前すれ969 mailto:sage [2008/07/26(土) 22:53:38 .net]
- UTF-16BEのテキストファイルをUTF-8に変換
Winの人は(ry #include <stdio.h> FILE*i,*o;int a,b;int F(int c){return putc(128|c%64,o);}int main(int c,char**v) {if(c>2&&(i=fopen(v[1],"r"))&&(o=fopen(v[2],"w")))for(;a=getc(i),a-EOF;((a=a<<8 |getc(i))>>11!=27)?a<128?putc(a,o):a<2048?(putc(192|a>>6,o),F(a)):(putc(224|a>> 12,o),F(a>>6),F(a)):(b=getc(i)%4,c=getc(i),a=64+a%1024,putc(240|a>>8,o),F(a/4), F(a<<4|b*4|c>>6),F(c)));return i&&fclose(i),o&&fclose(o),o?0:!!fprintf(stderr,c <3?"usage: %s input output\n":"fairu wo hirakenaijanaika! itteyoshi!!\n",*v);} エンディアンを自動判定するのは難しそうだな… それから、前スレ969のプログラム(UTF-8→UTF-16)を4文字ほど短縮した #include <stdio.h> FILE*i,*o;int l,p,t[]={0,192,224,240},r=65536;void P(int p){putc(p>>8,o);putc(p %256,o);}int main(int c,char**v){if(c>2&&(i=fopen(v[1],"r"))&&(o=fopen(v[2],"w" )))for(fputs("\xfe\xff",o);(c=getc(i))-EOF;(p-=r)>=0?P(p/1024+55296),P(56320+p% 1024):P(p+r))for(p=c-t[l=(c&224)-192?(c&240)-224?(c&248)-240?0:3:2:1];l--;p=p<< 6|getc(i)%128);return i&&fclose(i),o&&fclose(o),o?0:!!fprintf(stderr,c<3?"usag\ e: %s input output\n":"fairu wo hirakenurupoaijanaika! itteyoshi!!\n",*v);} あと、俺以外の人が変数の型を省いて短縮するのはいいけど、 stderrを省いて実行時に落ちるようになるのはやめてくれ むしろ、落ちるくらいなら無駄なメッセージ出力を無くしてしまった方がいい
|

|