2011-01-06 9 views
0

모든 라인의 시작 부분에 <item>을 추가하고 모든 라인의 끝에 </item >을 추가해야하는 C++ 프로젝트가 있습니다. 이 정상적인 영어 텍스트를 사용하여 잘 작동하지만이 작업을 수행 할 싶습니다 중국어 텍스트 파일이 있지만 작동하지 않습니다. 나는 일반적으로 .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 PANOSE}}

코드 :

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

+0

백틱을 사용하여 다음과 같이 코드를 이스케이프 처리합니다. "" –

+0

일반 텍스트 문서에 문제가있어 고객의 RTF 요구 사항이 있습니까? 올바른 인코딩을 사용하는 한 중국어 문서를 텍스트 문서로 출력 할 수 없습니다. –

답변

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

를 다시 방문해야 당신이 사용한다고 생각 ' 문자열 대신 '정규 char'대신 'wchar'을 사용하십시오.

+0

wchar 대신 wchar_t를 사용한다고 생각합니다. 그러나 이것은 도움이되지 않습니다. –

1

형식 태그 등을 무시하기 때문에 일반 텍스트와 같은 방식으로 RTF 코드를 읽을 수 없으며 코드가 깨질 수도 있습니다.

중국어 텍스트를 BOM없이 UTF-8을 사용하여 텍스트 파일로 저장하려고하면 코드가 작동합니다. 그러나 다른 UTF-8로 인코딩 된 문자에 본질적으로 줄 바꿈이 포함되어 있으면 (이 부분은 현재 확실하지 않음) 실제 UTF-8 변환을 시도하고 일반 문자 대신 넓은 문자를 사용하여 파일을 읽어야합니다 (Chan이 제안했듯이), C++을 사용하는 것이 조금 까다 롭습니다.

+0

UTF-8로 인코딩 된 문자는 정확한 문자가 아닌 한 ASCII 문자를 포함 할 수 없습니다. ASCII는 7 비트 인코딩이므로 항상 8 번째 비트가 설정되지 않았 음을 기억하십시오. UTF-8의 비 ASCII 문자는 항상 첫 번째 바이트와 모든 연속 바이트에 8 번째 비트가 설정됩니다. 이 속성은 UTF-8을 매우 매력적으로 만드는 요소 중 하나이며 UTF-16과 같은 일부 다른 인코딩에는 해당되지 않습니다. –

+0

파일이 UTF-8 (비표준 "UTF-8 BOM"의 유무와 관계없이) 인 경우 파일 처리 (예 :! eof)를 수정하면이 코드가 작동하기에 충분합니다. –

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 파서를 발견 할 것이다 어려운 요구 사항 인 경우.