2011-01-06 82 views
0

我有一個C++項目,應該在每行的開始處添加<item>,並在每行的末尾添加</item >。這與正常的英文文本工作正常,但我有一箇中文文本文件,我想這樣做,但它不起作用。我通常使用.txt文件,但爲此我必須使用.rtf來保存中文文本。在我運行我的代碼之後,它變成了亂碼。這是一個例子。C++文本文件,中文字符

{\ RTF1 \ adeflang1025 \ ANSI \ ansicpg1252 \ UC1 \ adeff31507 \ deff0 \ stshfdbch31506 \ stshfloch31506 \ stshfhich31506 \ stshfbi31507 \ deflang1033 \ deflangfe1033 \ themelang1033 \ themelangfe0 \ themelangcs0 {\ fonttbl {\ F2 \ fbidi \ fmodern \ fcharset0 \ fprq1 {* \潘 02070309020205020404}速遞 新;}

代碼:

int main() 
{ 
    ifstream in; 
    ofstream out; 
    string lineT, newlineT; 

    in.open("rawquote.rtf"); 
    if(in.fail()) 
     exit(1); 
    out.open("itemisedQuote.rtf"); 
    do 
    { 
     getline(in,lineT,'\n'); 
     newlineT += "<item>"; 
     newlineT += lineT; 
     newlineT += "</item>"; 
     if (lineT.length() >5) 
     { 
      out<<newlineT<<'\n'; 
     } 
     newlineT = ""; 
     lineT = ""; 
    } while(!in.eof()); 
    return 0; 
} 
+0

以純文本模式查看rawquote.rtf輸入文件以查看它真正包含的內容。 – aschepler 2011-01-06 16:28:01

+0

使用反引號來轉義代碼,如下所示:'''' – 2011-01-06 16:28:52

+0

RTF要求是來自客戶還是您自己的要求,因爲您在使用純文本文檔時遇到問題?只要使用正確的編碼,沒有理由不能將中文字符輸出到文本文檔中。 – 2011-01-06 16:31:42

回答

1

這看起來像RTF,這使得如你所說這是一個rtf文件。

基本上,如果你當你打開轉儲文件,你會看到它看起來像......

此外,你應該重新審視你的循環

std::string line; 
while(getline(in, line, '\n')) 
{ 
    // do stuff here, the above check correctly that you have indeed read in a line! 
    out << "<item>" << line << "</item>" << endl; 
} 
0

我認爲你應該使用' wchar'爲字符串而不是'常規字符'。

+0

我認爲你的意思是wchar_t而不是wchar,但這不太可能有所幫助。 – 2011-01-06 16:34:46

1

您不能像純文本一樣閱讀RTF代碼,因爲您會忽略格式標記等,並可能會破壞代碼。

嘗試使用UTF-8(不含BOM)將您的中文文本保存爲文本文件,並且您的代碼應該可以正常工作。然而,如果其他UTF-8編碼字符本質上包含換行符(現在不確定這部分),那麼這可能會失敗,所以您應該嘗試執行真正的UTF-8轉換並使用寬字符而不是常規字符讀取文件(如陳建議),這是使用C++有點棘手。

+0

任何UTF-8編碼字符都不能包含ASCII字符,除非它是完全字符。記住ASCII是一個7位編碼,因此總是有第8位未設置。 UTF-8中的任何非ASCII字符總是在第一個字節和任何連續字節中設置第8位。這個屬性是使UTF-8如此有吸引力的事情之一,對於其他一些編碼,如UTF-16,這是不正確的。 – 2011-01-06 18:25:30

+0

如果文件是UTF-8(帶有或不帶有非標準的「UTF-8 BOM」),那麼修復文件處理(即!eof)足以使此代碼正常工作。 – 2011-01-06 18:40:07

0

如果我理解此代碼的目標,您的解決方案不起作用。 RTF文檔中的換行不符合可見文本中的換行符。

如果您不能只使用純文本(中文字符不是有效編碼的問題),請查看RTF spec。你會發現這是一場噩夢。所以你最好打賭的可能是第三方庫,它可以解析RTF並通過「行」閱讀它「行」。我從來沒有找過這樣的圖書館,所以不要在我頭頂有任何建議,但我相信他們在那裏。

1

對於非中文文本來說,這是一種奇蹟。 「\ n」不是RTF中的行分隔符,「\ par」是。對於中國人來說,對RTF頭部造成更大傷害的可能性肯定更大。

C++不是解決此問題的最佳語言。它是在C#中的瑣碎5分鐘程序,只要該文件沒有得到太大:

using System; 
using System.Windows.Forms; // Add reference 

class Program { 
    static void Main(string[] args) { 
     var rtb = new RichTextBox(); 
     rtb.LoadFile(args[0], RichTextBoxStreamType.RichText); 
     var lines = rtb.Lines; 
     for (int ix = 0; ix < lines.Length; ++ix) { 
      lines[ix] = "<item>" + lines[ix] + "</item>"; 
     } 
     rtb.Lines = lines; 
     rtb.SaveFile(args[0], RichTextBoxStreamType.RichText); 
    } 
} 

如果C++是一個硬性要求,那麼你就必須找到一個RTF解析器。