2013-07-15 98 views
4

我在C++中遇到了一些非ASCII字符的問題。我有一個文件包含非ASCII字符,我通過文件處理在C++中讀取。讀取文件(比如1.txt)後,我將數據存儲到字符串流中,並將其寫入另一個文件(比如2.txt)。使用C++處理非ASCII字符

假設的1.txt包含:

ação 

在2.txt我應該得到相同的ouyput但非ASCII字符打印爲2.txt其十六進制值。

另外,我確定C++只處理Ascii字符,而不是Ascii。

請幫助就如何正確2.txt打印這些字符

編輯:

首先僞代碼全過程:

1.Shell script to Read from DB one Value and stores in 11.txt 
2.CPP Code(a.cpp) reading 11.txt and Writing to f.txt 

數據在數據庫目前正被讀:Instalação

文件11.txt包含:Instalação

文件F.txt包含:Instalação a.cpp的

輸出繼電器在屏幕上:Instalação

a.cpp

#include <iterator> 
#include <iostream> 
#include <algorithm> 
#include <sstream> 
#include<fstream> 
#include <iomanip> 

using namespace std; 
int main() 
{ 
    ifstream myReadFile; 
    ofstream f2; 
    myReadFile.open("11.txt"); 
    f2.open("f2.txt"); 
    string output; 
    if (myReadFile.is_open()) 
    { 
     while (!myReadFile.eof()) 
     { 
      myReadFile >> output; 
       //cout<<output; 

      cout<<"\n"; 

      std::stringstream tempDummyLineItem; 
      tempDummyLineItem <<output; 
      cout<<tempDummyLineItem.str(); 
      f2<<tempDummyLineItem.str(); 
     } 
    } 
    myReadFile.close(); 
    return 0; 
} 

區域設置這樣說:

LANG=en_US.UTF-8 
LC_CTYPE="en_US.UTF-8" 
LC_NUMERIC="en_US.UTF-8" 
LC_TIME="en_US.UTF-8" 
LC_COLLATE="en_US.UTF-8" 
LC_MONETARY="en_US.UTF-8" 
LC_MESSAGES="en_US.UTF-8" 
LC_PAPER="en_US.UTF-8" 
LC_NAME="en_US.UTF-8" 
LC_ADDRESS="en_US.UTF-8" 
LC_TELEPHONE="en_US.UTF-8" 
LC_MEASUREMENT="en_US.UTF-8" 
LC_IDENTIFICATION="en_US.UTF-8" 
LC_ALL= 
+0

那麼到底什麼是您的問題? 「如何識別ASCII字符,並將非ASCII碼打印爲十六進制?」 –

+0

發佈您的實際代碼(展示您的問題的最小樣本),然後我們可以告訴您需要做什麼最小的更改。 – chris

+0

我想僅在2中打印非ascii字符作爲非ASCII字符。TXT,而不是他們的十六進制值 –

回答

2

至少如果我明白你在做什麼,我會做這樣的事情:

#include <iterator> 
#include <iostream> 
#include <algorithm> 
#include <sstream> 
#include <iomanip> 

std::string to_hex(char ch) { 
    std::ostringstream b; 
    b << "\\x" << std::setfill('0') << std::setw(2) << std::setprecision(2) 
     << std::hex << static_cast<unsigned int>(ch & 0xff); 
    return b.str(); 
} 

int main(){ 
    // for test purposes, we'll use a stringstream for input 
    std::stringstream infile("normal stuff. weird stuff:\x01\xee:back to normal"); 

    infile << std::noskipws; 

    // copy input to output, converting non-ASCII to hex: 
    std::transform(std::istream_iterator<char>(infile), 
     std::istream_iterator<char>(), 
     std::ostream_iterator<std::string>(std::cout), 
     [](char ch) { 
      return (ch >= ' ') && (ch < 127) ? 
       std::string(1, ch) : 
       to_hex(ch); 
    }); 
} 
1

聽起來像是一個utf8問題。因爲你沒有用C++標記你的問題11 Here是關於unicode和C++流的優秀文章。

從您的更新代碼,讓我解釋發生了什麼。你創建一個文件流來讀取你的文件。在內部,文件流只能識別chars,除非您另有說明。在大多數機器上,一個char只能保存8位數據,但文件中的字符使用的位數多於8位。爲了能夠正確讀取你的文件,你需要知道它是如何編碼的。最常見的編碼是UTF-8,每個字符使用1到4個chars。一旦你知道了你的編碼,你可以使用wifstream(對於UTF-16)或者imbue()一個語言環境來進行其他編碼。

更新: 如果您的文件是ISO-88591(來自您上面的評論),請嘗試此操作。

wifstream myReadFile; 
myReadFile.imbue(std::locale("en_US.iso88591")); 
myReadFile.open("11.txt");