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
[75380] Re:Re:영문 윈도우에서 텍스트 파일 읽기
뽀뽀중 [kissjung] 3001 읽음    2019-04-26 10:34
빌더(TWx) 님이 쓰신 글 :
: 뽀뽀중 님이 쓰신 글 :
: : 한글윈도우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 마커를 의미 함.
:
:
:
: 다음 부터 질문할 때는 요령있게 해당 파일도 같이 첨부해서 올려요.
:
:

상세한 설명 감사 드립니다. ^^;

프로그램 작성 할때 한글 윈도우에서만 사용할 것이라는 생각에 문자코드페이지에 대한 고려를 전혀 하지 않았습니다.
문자코드페이지가 다르더라도, 영문 및 숫자, 기호 등은 문제없이 읽을수 있을 것 같은 막연한 기대를 했습니다.

그런데, 외국에 장기출장을 하며 영문윈도우를 사용해야 했고,
영문윈도우에서는 text 파일을 전혀 읽지를 못하는 문제가 발생 하였습니다.
한글만 인식을 못하는 것이 아닌, 첫 라인부터 읽지를 못 하였습니다.

문자코드페이지 때문인 것은 알고 있었는데, 해결 방안을 인터넷 검색을 하였는데도 쉽게 찾기가 어려워 질문을 올린 것입니다.
다음 부터는 관련 파일도 같이 올리도록 하겠습니다. (지금 첨부를 하였습니다.)

이번에 문자코드페이지 문제를 경험해 보니, 다국어 지원이 생각보다 많이 복잡하고 어려운듯 합니다.

프로그램에서 메뉴는 한글 언어팩을 설치해서 인지 모르겠지만, 한글이 문제없이 보입니다.
다만, AnsiString 로 변수 형 을 선언하고, 한글을 대입한 경우, 글자가 깨지고 재대로 인식을 못하여 정상작동을 확신할수 없는것 같습니다.

AnsiString을 전부 UnicodeString 으로 변경하면, 다국어 (영어, 프랑스어  등) 윈도우에서 문제없이 실행이 가능 한지 궁금 합니다.

감사 합니다.

+ -

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