2009-08-08 5 views
2

일부 Microsoft보고 도구를 사용하여 만든 텍스트 파일이 있습니다. 텍스트 파일은 처음에 BOM0xFFFE을 포함하고 문자 사이에 널 문자 (예 : "F.i.e.l.d.1.")가있는 ASCII 문자 출력을 포함합니다. 나는 iconv을 사용하여 이것을 UTF-8으로 변환 할 수 있으며, UCS-2LE을 입력 형식으로 사용하고 UTF-8을 출력 형식으로 사용하면 ... 훌륭합니다.UCS-2LE 텍스트 파일 구문 분석

내 문제는 UCS-2LE 파일의 줄을 문자열로 읽고 필드 값을 구문 분석 한 다음 ASCII 텍스트 파일 (예 : Field1 Field2)에 써야한다는 것입니다. stringwstring 기반 버전의 getline을 시도했습니다. 파일에서 문자열을 읽는 동안 값으로 문자열을 해석하므로 시작 및 길이 값이 꺼집니다.

UCS-2LE 데이터를 C++ 문자열로 읽고 데이터 값을 추출하려면 어떻게해야합니까? 나는 수많은 구글 검색뿐만 아니라 boosticu을 보았지만 아무 것도 발견하지 못했다. 내가 여기서 무엇을 놓치고 있니? 도와주세요!

내 예제 코드는 다음과 같습니다

wifstream srcFile; 
srcFile.open(argv[1], ios_base::in | ios_base::binary); 
.. 
.. 
wstring srcBuf; 
.. 
.. 
while(getline(srcFile, srcBuf)) 
{ 
    wstring field1; 
    field1 = srcBuf.substr(12, 12); 
    ... 
    ... 
} 

그래서, 경우, 예를 들어, srcBufsubstr() 반환 위의 다음 대신 "g.e.n.e.r.a.l.i.t.i.e.s."의 ".k. i.n. g.e"을 "W.e. t.h.i.n.k. i.n. g.e.n.e.r.a.l.i.t.i.e.s."를 포함하고 있습니다.

내가 원하는 것은 멀티 바이트 표현에 대해 걱정할 필요없이 문자열을 읽고 처리하는 것입니다. 누구든지 boost (또는 다른 것)을 사용하여 파일에서이 문자열을 읽고 내부 사용을 위해 고정 너비 표현으로 변환하는 예가 있습니까?

나는 Mac에서 Eclipse와 gcc를 사용하고 있습니다. STL은 넓은 문자열을 인식하지 못합니까?

감사합니다.

답변

0

substr이 g ++ 4.3.3을 사용하는 Linux에서 제대로 작동합니다. 프로그램

#include <string> 
#include <iostream> 

using namespace std; 

int main() 
{ 
    wstring s1 = L"Hello, world"; 
    wstring s2 = s1.substr(3,5); 
    wcout << s2 << endl; 
} 

"lo, w"로 인쇄해야합니다.

그러나 파일 읽기는 예상 한 것과 다를 수 있습니다. 로켈 인코딩의 파일을 wchar_t로 변환하여 각 바이트가 자체 wchar_t가되도록합니다. 나는 표준 라이브러리가 wchar_t로 UTF-16을 읽는 것을 지원한다고 생각하지 않는다.

+0

답장을 보내 주셔서 감사합니다. 나는 같은 행동을 본다. 당신이 말했듯이, 나는 wchar_t에 대한 UTF-16이 지원되지 않는다고 생각한다. iconv를 사용하여 파일을 UFT-8로 변환하고 문제가 해결되었습니다. – Cryptik

+0

나는 아마 여기에 유령을 다루고 있지만, @ Cryptik은 해결 된 것처럼 그의 질문을 표시해야합니다 :) – Dr1Ku

1

이 질문을 다루는 좋은 시간을 보냈다 데, 여기 내 결론은 다음과 같습니다 UTF-16 (또는 UCS2-LE) 파일을 읽기

  • 는 C++ 11에서 분명히 관리이며, 이후 How do I write a UTF-8 encoded string to a file in Windows, in C++

  • 참조 boost::locale 라이브러리는 이제 C++ 11의 일부이며, 단지 codecvt_utf16을 사용할 수 있습니다 (최종 코드 샘플은 아래 글 머리 기호 참조)

  • 그러나 오래된 컴파일러 (예 :아주 멋지게 또한, 하나는 독서의 this method 시도 할 수 있습니다 Writing UTF16 to file in binary mode

  • this answer에 예시 된 바와 같이 내 경우에는 작동하지 않았지만 MSVC 2008), 당신은, locale 및 사용자 정의 codecvt면/"레시피"를 사용할 수 있습니다. 결과는 가비지 문자로 대체 된 행이 누락됩니다.

나는이 내 사전 C++ 11 컴파일러에서 수행 얻을 수 없습니다 루비에 스크립팅에 의지했고, 프로세스 (그냥 테스트에서의 산란 그래서 합병증의 종류를 생각한다 거기에 괜찮습니다) 내 작업을 실행합니다.

희망은 다른 사람들에게 도움이되기를 바랍니다.