在群裡面聽到有人說起有一款新的編輯器 Sublime Text 2 很不錯, 於是我下載下來試用了一下, 發現不支援
中文, 聽說要安裝什麼外掛程式, 不管了, 沒打算用, 但... 我開啟了我的一個原始碼C檔案, 突然發現了一點小錯誤, 就用
ST2修改後Ctrl+S儲存了, 當時沒在意什麼, 到了幾天后的今天, 一看, 突然代碼中的中文全部變成了亂碼, 用強大的Notepad++
也沒能識別出檔案的編碼, 結果, 只好用 WinHex 查看 16進位 內容, 咋一看, 著實嚇了我一跳, 中文居然被編碼成1個漢字
4個位元組, 而且還很有規律, ...
規律是每個漢字被加上了兩個位元組的C2/C3, 不懂是為什麼!
比如原來一個中文的兩個位元組:11 22
結果可能就成為:C2 11 C2 22
擦, 無語, 嚇得我汗下, 那麼多的代碼, 中文全沒了....
所有的規律(資料為16進位):
C3 X1 C3 X2 => X1+40,X2+40
C3 X1 C2 X2 => X1+40,X2
C2 X1 C3 X2 => X1,X2+40
C2 X1 C2 X2 => X1,X2
亂碼後:
原始碼:
#include <stdio.h>#include <string.h>#include <stdlib.h>//女孩不哭 QQ:191035066 2013-05-29 20:35int replace(unsigned char* orig,unsigned char* result,int* result_len){ unsigned char* ps = result; while(*orig){ if(*orig<0x80){ *ps++ = *orig; orig++; }else if(orig[0]==0xC2 && orig[2]==0xC2){ //C2 X1 C2 X2 => X1,X2 *ps++ = orig[1]; *ps++ = orig[3]; orig += 4; }else if(orig[0]==0xC2 && orig[2]==0xC3){ //C2 X1 C3 X2 => X1,X2+40 *ps++ = orig[1]; *ps++ = orig[3]+0x40; orig += 4; }else if(orig[0]==0xC3 && orig[2]==0xC2){ //C3 X1 C2 X2 => X1+40,X2 *ps++ = orig[1]+0x40; *ps++ = orig[3]; orig += 4; }else if(orig[0]==0xC3 && orig[2]==0xC3){ //C3 X1 C3 X2 => X1+40,X2+40 *ps++ = orig[1]+0x40; *ps++ = orig[3]+0x40; orig += 4; } } *result_len = (unsigned int)ps-(unsigned int)result; return 1;}int main(int argc, char** argv){ FILE* fp = NULL; size_t file_len = 0; unsigned char* buffer = NULL; if(argc != 2){ printf("st2_dec:命令列參數不正確,缺少檔案!\n"); return 1; } fp = fopen(argv[1],"rb"); if(fp == NULL){ fprintf(stderr,"st2_dec:不能開啟檔案:%s\n",argv[1]); return 1; } fseek(fp,0,SEEK_END); file_len = ftell(fp); fseek(fp,0,SEEK_SET); if(file_len == 0){ fprintf(stderr,"st2_dec:空白檔案!\n"); fclose(fp); return 2; } buffer = (unsigned char*)malloc(file_len+1); if(buffer == NULL){ fprintf(stderr,"st2_dec:分配緩衝區失敗!\n"); fclose(fp); return 3; } memset(buffer,0,file_len+1); fread(buffer,1,file_len,fp); fclose(fp); replace(buffer,buffer,&file_len); fp = fopen("st2_dec.txt","wb"); if(fp == NULL){ fprintf(stderr,"st2_dec:建立輸出檔案時失敗!\n"); free(buffer); return 4; } fwrite(buffer,1,file_len,fp); fclose(fp); free(buffer); printf("st2_dec:成功, 輸出到檔案:st2_dec.txt\n"); return 0;}
VC6項目及EXE下載:http://files.cnblogs.com/nbsofer/st2_dec.7z
女孩不哭 @ 2013-05-29 20:54:57 @ http://www.cnblogs.com/nbsofer