문제

일부 Microsoft 보고 도구를 사용하여 생성된 텍스트 파일이 있습니다.텍스트 파일에는 다음이 포함됩니다. BOM 0xFFFE 처음에는 그 다음에는 ASCII 문자 사이에 널이 있는 문자 출력(예: "F.i.e.l.d.1.").나는 사용할 수 있다 iconv 이것을로 변환하려면 UTF-8 사용하여 UCS-2LE 입력 형식으로 UTF-8 출력 형식으로...그것은 잘 작동합니다.

내 문제는 내가 UCS-2LE 파일을 문자열로 변환하고 필드 값을 구문 분석한 다음 이를 ASCII 텍스트 파일(예: Field1 Field2).나는 string 그리고 wstring기반 버전 getline – 파일에서 문자열을 읽는 동안 다음과 같은 기능이 수행됩니다. substr(start, length) 문자열을 다음과 같이 해석하십시오. 8-bit 값이므로 시작 및 길이 값이 꺼져 있습니다.

어떻게 읽나요? UCS-2LE 데이터를 C++ 데이터 값을 문자열로 묶고 추출하시겠습니까?나는 보았다 boost 그리고 icu 수많은 Google 검색뿐만 아니라 작동하는 항목을 찾지 못했습니다.내가 여기서 무엇을 놓치고 있는 걸까요?도와주세요!

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

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);
    ...
    ...
}

예를 들어, srcBuf "를 포함합니다.W.e. t.h.i.n.k. i.n. g.e.n.e.r.a.l.i.t.i.e.s."그럼 substr() 위는 "를 반환합니다..k. i.n. g.e" 대신에 "g.e.n.e.r.a.l.i.t.i.e.s.".

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

그런데 저는 Eclipse와 gcc를 사용하는 Mac을 사용하고 있습니다.가능할까요 내 STL 와이드 문자열을 이해하지 못하시나요?

감사해요!

도움이 되었습니까?

해결책

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가됩니다. 표준 라이브러리가 UTF-16을 WCHAR_T로 읽는 것을 지원한다고 생각하지 않습니다.

다른 팁

이 질문에 대해 많은 시간을 투자한 결과, 내 결론은 다음과 같습니다.

  • 읽기 UTF-16 (또는 UCS2-LE) 파일은 분명히 C++11에서 관리 가능합니다. C++에서 Windows의 파일에 UTF-8로 인코딩된 문자열을 쓰는 방법

  • 이후 boost::locale 라이브러리는 이제 C++11의 일부입니다. codecvt_utf16 (최종 코드 샘플은 아래 글머리 기호 참조)

  • 그러나 이전 컴파일러에서는(예:MSVC 2008)을 사용할 수 있습니다. locale 그리고 관습 codecvt 패싯/"레시피"는 매우 훌륭하게 예시되어 있습니다. 이 답변 에게 바이너리 모드에서 파일에 UTF16 쓰기

  • 또는 시도해 볼 수도 있습니다. 이 방법 내 경우에는 작동하지 않았지만 읽기가 가능했습니다.출력에는 가비지 문자로 대체된 행이 누락됩니다.

C++11 이전 컴파일러에서는 이 작업을 수행할 수 없었고 Ruby에서 스크립트를 작성하고 프로세스를 생성해야 했습니다(단지 테스트 중이므로 그런 종류의 복잡한 문제는 괜찮다고 생각합니다). 일.

이것이 다른 사람들에게 시간을 벌 수 있기를 바라며 기꺼이 도와드리겠습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top