查看完整版本: 關於Unicode編碼
頁: [1]

在那裡 發表於 2016-8-27 05:06 PM

關於Unicode編碼

本帖最後由 在那裡 於 2016-8-27 05:09 PM 編輯

我最近寫了一個加密程式,我是以ASCII碼切成四個區段進行加減(-128~127)來加密的。
我以記事本(ANSI編碼)進行加密到一個新的記事本(ANSI編碼),全都正常的跑完也正常。

但是若我把ANSI全改成Unicode編碼的記事本就會亂碼,加密也總會莫名其妙的停掉,只加密一點點文字(不超過五十個字),但是用ifstream的.eof()和.fail()得知是因到底而停止。
而且解密出來也只有一些正確的字,

請問Unicode是如何進行編碼的?跟ASCII有何關係?
為什麼ifstream.eof()在還沒到底時會顯示true?

...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

kilean 發表於 2016-8-28 09:49 PM

Unicode超出我的能力範圍,我只能說,網路上都有資料。
顯示Unicode格式的文字,首先要看環境支援不支援,就算有支援,資料也存Unicode格式,
但也有可能會顯示亂碼,要先設定顯示的格式,才能正常顯示你所儲存的內容。
像我的工具就不支援,就要下更多工夫去研究WinAPI。
剩下的,就看你的問題到哪邊,看看有沒有其他高手能解惑你的問題。

inunu 發表於 2016-8-29 04:23 AM

本帖最後由 inunu 於 2016-8-29 04:25 AM 編輯

其實我覺得問題不在 Unicode
而是你的算法本身遇到某些數值會出狀況
你可以寫個測試
把 -128, -127, ... 127 各數值丟進加密函數
再把輸出的數值丟進解密函數
看哪些解出來的數值不對如果解出來的數值都正確
不要說 unicode 了, 連 .zip .rar 非文字檔它都可以正常處理

在那裡 發表於 2016-8-31 11:24 PM

本帖最後由 在那裡 於 2016-8-31 11:25 PM 編輯

抱歉,晚回了,最近剛開學.......

我的算法處理數字範圍只有-128~127,其他超過這數字的我就沒再去動了(應該也不會出現這種數字)。
測試過後我發現一切都正常,並沒有出任何錯誤。

至於Unicode,我是拿我一本電子小說(TXT檔,Unicode編碼)來進行加密的.....不過加著加著不到1KB就自己終止了;
把他改成ANSI編碼則就能完全加密,且解密完後資料也無錯誤。...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

ren1244 發表於 2016-9-1 12:17 AM

不知道方不方便貼上您部分的程式碼呢?
不然都只能用猜的。<br><br><br><br><br><div></div>

在那裡 發表於 2016-9-3 08:15 PM

本帖最後由 在那裡 於 2016-9-3 08:21 PM 編輯

抱歉又晚回,最近有些忙

加密解密用的加減法

char Encrypt(char word)
{   using namespace std;


    if(word <=100 && word >= 0)    //0~100
        return word+27;//27~127
    else if(word>100)               //101~ 127
        return word-101;//0~26
    else if(word>=-100 && word < 0) // -1 ~ -100
        return word-28; // -29 ~ -128
    else if(word<-100)              // -101 ~ -128
        return word+100;//-1 ~ -28
    else
        return word;

}

char Decrypt(char word)
{   using namespace std;

    if(word>=27)                   //27~127
        return word-27;//0~100
    else if(word<27 && word>=0)    //0~26
        return word+101;//101~127
    else if(word<=-29)              //-29~-128
        return word+28;//-1~-100
    else if(word>-29 && word<0)     //-28~-1
        return word-100;//-101~-128
    else
        return word;
}

加密的過程(解密差不多,只是文字改了而已),且結果檢查出來都只會跳出 加密完成(解密完成)!

    char ch;
    iFile.get(ch);
    while(iFile.good())
    {
        ch = Encrypt(ch);
        oFile << ch;
        iFile.get(ch);
    }

    if(iFile.eof())
        cout << "加密完成!" << endl;
    else if(iFile.fail())
        cout << "因資料型態不合而終止。" << endl;
    else
        cout << "因不明原因中止。" << endl;

    iFile.close();
    oFile.close();
    system("pause");
    return;

...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

ren1244 發表於 2016-9-6 01:10 AM

今天才看到...

經過測試我可以正常執行,網上抓了一整篇的小說加解密是正常的。
不知道是不是其他部分出問題?
我完整的程式可參考下方。

編譯後,使用方法
加密:執行檔 -e 輸入檔名 輸出檔名
解密:執行檔 -d 輸入檔名 輸出檔名

#include <iostream>
#include <fstream>

char Encrypt(char word)
{
        if(word <=100 && word >= 0)        //0~100
                return word+27;//27~127
        else if(word>100)                           //101~ 127
                return word-101;//0~26
        else if(word>=-100 && word < 0) // -1 ~ -100
                return word-28; // -29 ~ -128
        else if(word<-100)                          // -101 ~ -128
                return word+100;//-1 ~ -28
        else
                return word;
}

char Decrypt(char word)
{
        if(word>=27) //27~127
                return word-27;//0~100
        else if(word<27 && word>=0)        //0~26
                return word+101;//101~127
        else if(word<=-29)                          //-29~-128
                return word+28;//-1~-100
        else if(word>-29 && word<0)         //-28~-1
                return word-100;//-101~-128
        else
                return word;
}

int main(int argc,char* argv[])
{
        if(argc!=4)
        {
                std::cout<<"needs 3 argument.\n";
                return 0;
        }
        int mode;
        char ch;
        std::fstream iFile,oFile;
       
        if(std::string(argv).compare("-e")==0)
                mode=0;
        else if(std::string(argv).compare("-d")==0)
                mode=1;
        else
        {
                std::cout<<"mode error!\n";
                return 0;
        }
        iFile.open(argv,std::fstream::in);
       
        if(!iFile.is_open())
        {
                std::cout<<"can't open file:"<<argv<<"\n";
                return 0;
        }
       
        oFile.open(argv,std::fstream::out);
        if(!oFile.is_open())
        {
                std::cout<<"can't open file:"<<argv<<"\n";
                iFile.close();
                return 0;
        }
       
        iFile.get(ch);
        while(iFile.good())
        {
                ch = mode==0?Encrypt(ch):Decrypt(ch);
                oFile << ch;
                iFile.get(ch);
        }

        if(iFile.eof())
                std::cout << "Done!\n";
        else if(iFile.fail())
                std::cout << "Data type error\n";
        else
                std::cout << "unknow error\n";

        iFile.close();
        oFile.close();
        return 0;
}


...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>
頁: [1]