2010-02-14 2 views
3

다음은 프로그램입니다. http://codepad.org/eyxunHot
파일의 인코딩은 UTF-8입니다. , ➑ball 나는 "UTF-8"인코딩으로 파일을 저장 메모장을 사용하는 경우인코딩과 관계없이 wifstream에서 올바른 텍스트 추출

, 다음 프로그램을 실행에 따라 :

나는 거기에 다음과 같은 단어 "의 config.ini"라는 이름의 텍스트 파일이 디버거에 eight_ball의 값입니다 : 나는 "유니 코드"인코딩으로 파일을 저장 메모장을 사용하는 경우  아발

, 다음 프로그램을 실행 eight_ball의 값이 디버거에 따라 : y 번째 ' b

메모장을 사용하여 "유니 코드 크기가 큰 파일 저장" 엔디안 "인코딩을 실행 한 다음 디버거에 따라 프로그램을 실행하면 eight_ball의 값은 입니다.

이 경우 모두 결과가 잘못됩니다. 또한 ANSI 인코딩은 ➑ 기호를 지원하지 않습니다. 인코딩에 관계없이 config_file >> eight_ball로 갈 때 파일에서 ➑ball이라는 단어를 추출 할 수 있도록하려면 어떻게해야합니까? 나는 config.ini의 인코딩에 관계없이이 프로그램의 출력을 "프로그램이 맞다"싶습니다.

+1

문제는 근본적으로 해결할 수 없습니다. 내용이 "유효한"8 문자 인 Latin-1 파일을 저장하면 ➑볼 (유효한 문자 5 자)이 포함 된 UTF-8 파일과 구별 할 수 없습니다. 그것들은 같은 8 바이트입니다. – MSalters

답변

0

wstreams가 올바르게 작동하려면 먼저 로케일을 설정해야합니다. 필자는 입력 코드화가 일반적으로 달라지기 때문에 문자 변환을 위해 일반 스트림과 라이브러리를 사용할 것을 제안합니다. 가장 좋은 알고리즘은 요즘 UTF-8로 읽으려고 시도하는 것이고 실패 할 경우 CP1252 또는 다른 사용자가 구성 할 수있는 레거시 charset으로 읽으십시오.

+0

좀 더 구체적으로 알려주시겠습니까? 이 "캐릭터 변환을위한 라이브러리"는 무엇을 사용해야합니까? 파일이 UTF-8로 인코딩되었다는 것을 알고 있다면 어떻게 읽습니까? – scwizard

+1

iconv 라이브러리를 사용해 볼 수 있습니다. –

1

INI 파일을 사용하려는 경우 INI API가 유니 코드 (UTF-16 리틀 엔디안) INI 파일을 문제없이 지원한다는 점에 유의하십시오. 빈 파일에는 BOM 처음에는

그런데 C++ 스트림 및 유니 코드로 작업하려면 this article을보아야 할 수 있습니다. UTF8 외에도 C++ 스트림에서 캐릭터 변환이 어떻게 작동 하는지를 배우게됩니다.

1

아마도 ICU 라이브러리를 사용할 수 있습니다.

Windows에는 UTF 지원과 관련된 많은 문제가 있습니다. 내 우분투는 기본 UTF-8 인코딩을 사용하며이 문제는 해결되었지만 OS와 같은 유닉스는 C++ standart 라이브러리의 이상한 실현을 가지고 있습니다. UTF-8 텍스트 (문자 배열에 2 셀 사용)를 보유하기 위해 char *를 사용한다는 의미입니다. 그러나 문자열 클래스를 사용하면 제거됩니다.