用 Sublime Text 2 保存中文后亂碼問題的解決方法(可能解決)


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

int 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
  http://alioss.twofei.com/windows/st2_dec.7z

女孩不哭 @ 2013-05-29 20:54:57 @ http://www.cnblogs.com/nbsofer


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM