C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[75379] Re:영문 윈도우에서 텍스트 파일 읽기
빌더(TWx) [builder] 3126 읽음    2019-04-26 02:15
뽀뽀중 님이 쓰신 글 :
: 한글윈도우10 에서 프로그램을 작성 하였습니다.
:
: 아래와 같이 코드를 작성을 하여 text 파일을 일고 쓰고 하였습니다. 한글 윈도우에서는 문제 없이 정상입니다.
:
: 그런데, 영문윈도우에 한글언어팩을 설치 하여 한글을 사용중인데.
: 프로그램을 실행을 하면,  text 파일을 읽지 못합니다.
:
: 아마도 글자 코드가 다르게 되어 발생한 문제 인것 같습니다.
: 같은 코드를 여러곳에 사용을 하여, 일일이 수정 하기가 힘든데 쉽게 해결하는 방법이 있나요?
:
: string sTemp;
: ifstream Fin;
:
: Fin.open(GFileName.c_str());
: while (getline(Fin, sTemp)) { // text를 읽지를 못합니다.
:    //text 파일 읽는 코드
:  }
:
:


답변:


다음 부터 질문할 때는...

질문의 키포인트를 확정할 수 있는 해당 파일을 같이 첨부하세요.
"읽지 못하는 텍스트" 파일을 같이 첨부해서 올려야 encoding scheme 문제인지
아니면 코드페이지가 달라서 일어나는 문제인지 확정 할 수 있을 거 아닙니까.

소스코드 에디터를 만들 때... 가장 먼저 구현해야 하는 부분이...
해당 파일이 어떤 encoding 방식을 사용하고 있는가를 디렉트하는 루틴 작성이고
bom 마커를 갖고있으면 쉽게 해당 파일의 encoding 방식을 판단할 수 있으나...
그렇지 않을 경우에는 파일 전체를 스캔해서 문자코드가 특정 encoding 방식에서
지원되는 문자셋으로 표현될 수 있는가를 휴레스틱 알고리즘을 구현해서 지능적으로 판단해야 합니다.


본론으로 돌아와서...

std::wifstream 을 사용하지 않고...
std::ifstream 을 사용한 것으로 보아서는...

MBCS 형식으로 파일을 다루는 것 같은데...

한글과 영문 버전의 OS는 시스템 디폴트 코드페이가 서로 다릅니다.
한글 버전으로 설치하면 시스템 디폴트 코드페이지로 cp 949 가 적용되어 한글표현이 자유롭지만
영문 버전에선 다른 코드페이지가 적용되어 한글이 깨지게 됍니다.

한글 버전 윈도우즈 시스템에서 MBCS(Ansi) 형식으로 작성된 텍스트 파일을
영문 버전의 윈도우즈 시스템에서 읽으면 한글 언어팩을 설치하더라도
다른 시스템 디폴트 코드페이지가 적용되기 때문에 한글이 깨지게 됩니다.

#include <fstream>
#include <sstream>

   using namespace std;
   ifstream ifs("c:/test/test.txt"); // MBCS 형식의 파일

   stringstream strs; strs << ifs.rdbuf();

   while(strs) {
      std::string s; strs >> s;
      Memo1->Lines->Add( AnsiStringT<949>(s.c_str()) ); // 한 라인씩 cp 949 코드페이지 적용해서 처리.
   }

따라서...

한글 버전 OS에서 cp 949 코드페이지가 적용되어 작성되어 있는 MBCS 형식의 텍스트 파일을
한글 언어팩이 설치되어 있는 영문 윈도우즈 시스템에서 정상적으로 읽기 위해선
위와 같이 cp 949를 적용해서 처리해야 합니다.


시스템 메뉴 등의 문자는 영문으로 표시되게 하면서, 한글도 사용할 수 있게 하기위해
영문 OS 에 한글언어팩을 설치해서 사용하려는 의도인가 본데...

위와 같은 변환 코드가 번거로우면...

윈도우즈 10을 예로 들어서...

설정 - 언어 - 관리 언어 설정 - 관리자 옵션 - 시스템 로캘 변경...

으로 들어가서 유니코드가 아닌 MBCS 형식을 사용할 때 적용할 언어를 한국어로 바꿔놓으면
시스템 메뉴 등은 영문으로 표시하면서 디폴트 코드페이지가 CP 949로 적용되게 할 수 있습니다.


STL 템플릿 이용하면 utf8, unicode (16bit, 32bit, little endian, big endian), char16_t, char32_t, BOM 마커 처리 등
모든 것들을 디테일 하게 처리 할 수도 있지요.

예)

   ifs.imbue(std::locale(ifs.getloc(), new std::codecvt_utf16<wchar_t, 0x10ffff,
        std::codecvt_mode(std::little_endian|std::consume_header)>));

여기서 consume_header는 BOM 마커를 의미 함.



다음 부터 질문할 때는 요령있게 해당 파일도 같이 첨부해서 올려요.


+ -

관련 글 리스트
75377 영문 윈도우에서 텍스트 파일 읽기 뽀뽀중 2697 2019/04/24
75379     Re:영문 윈도우에서 텍스트 파일 읽기 빌더(TWx) 3126 2019/04/26
75385         Re:Re: 퍼갑니다 2810 2019/04/27
75380         Re:Re:영문 윈도우에서 텍스트 파일 읽기 뽀뽀중 3218 2019/04/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.