用 Sublime Text 2 儲存中文後亂碼問題的解決方案(可能解決)

來源:互聯網
上載者:User

  在群裡面聽到有人說起有一款新的編輯器 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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.