2011-03-14 5 views
1

C에서 UTF-8 인코딩 파일을 읽고 "UTF-8 호환 문자열"에 데이터를 저장할 수있는 방법이 필요합니다. 이 데이터는 나중에 UTF-8로 인코딩 된 파일에 다시 작성해야합니다. Windows에서이 작업을 수행하는 것에 대한 Google의 조언은 많이 있지만 유닉스 시스템에서는 도움이되지 않습니다.Unix/Mac OS X에서 C++ UTF-8 지원

도움 주셔서 감사합니다.

답변

0

std :: string은 읽고 쓰는 것만으로 충분합니다. 텍스트의 표준 처리 라인 순서의 끝과 관련하여 잘 작동하고 스트림에 의해 수행 다른 처리가 없기 때문에 더 멀티 문자 UTF 코드 포인트는 ASCII 문자와 중복하지 않기 때문에

std::ifstream fileIn("file.utf8"); 

std::string line; 
std::getline(fileIn, line); // Reads a UTF-8 line 

std::ofstream fileOut("OutFile.utf8"); 
fileOut << line; // Writes a line of UTF-8 text 

이 작동합니다. 당신이 읽는 것은 당신이 얻는 것입니다. 문자열을 출력해도 코드 포인트가 변경되지 않습니다.

이제는 다른 질문 인 텍스트를 조작해야하며 더 복잡해집니다.

일반적으로 UTF-8을 조작하는 것은 어렵습니다 (수행 할 수 있지만 IMO 할 가치가 없습니다).

UTF-8 (고정 폭이 아닌)을 내부 고정 폭 형식으로 변환하려는 텍스트를 조작하는 경우, (UTF-16 또는 UTF-32는 조작을위한 일반적인 형식이며 사용하기 쉽습니다 (UTF-16 창, OS와 같은 대부분의 * nix 용 UTF-32)). 이렇게하는 가장 쉬운 방법은 입력이 UTF-8로되어 있고 자동으로 변환한다는 것을 알고있는면을 스트림에 묻는 것입니다.

서로 다른 라이브러리에 떠 다니는 몇 가지 요소가 있습니다.

http://www.boost.org/doc/libs/1_38_0/libs/serialization/doc/codecvt.html

주 : 그러나 쉽게 찾을 수 하나는 부스트입니다 그것은 boost 1.46

std::locale old_locale; 
std::locale utf8_locale(old_locale,new utf8_codecvt_facet<ucs4_t>); 
           // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The important bit 
           // Note here we are converting to UTF-32(UCS-4) 

std::wifstream fileIn; 
fileIn.imbue(utf8_locale); // Imbue the stream with the knowledge. 

fileIn.open("file.utf8"); 
// Now read wide characters from the stream. The UTF-8 file is converted 
// into UTF-16/UTF-32 for internal processing. 

std::wstring wideLine; 
std::getline(fileIn, wideLine); // Read a line converting to UTF-16/32 

프로세스의 최신 버전도 있습니다 다시 UTF-32분의 16을 writting에 대해 동일 스트림을 UTF-8로 변환

std::wofstream fileOut; 
fileOut.imbue(utf8_locale); 

fileOut.open("OutFile.utf8"); 
fileOut << wideLine;  // Write a UTF-16/32 line and convert into UTF-8 

참고. 파일이 열리기 전에 파일을 불러 와야합니다. 스트림의 다른 구현은, 스트림이 열리고 나서, 그 스트림에 임 플린팅하는 경우, 다르게 반응합니다. 따라서 스트림을 열기 전에 스트림을 묻는 것이 가장 좋습니다.

Dinkumware에는 변환 패싯 집합이 있습니다 (자유 임 경우 확실하지 않음).
http://www.dinkumware.com/manuals/default.aspx?manual=compleat&page=index_cvt.html#Code%20Conversions

참고 : UCS-Y 대신 UTF-X라는 용어를 사용하는 것이 좋습니다. 기술적으로는 사소한 차이점이 있지만 주제에 대해 이야기하면서 두 용어 사이를 전환하여 만들 수있는 혼란과 비교하면 중요하지 않습니다. 특정 기능 (예 : 대리 쌍)에 관해 명시 적으로 얘기해야하는 경우가 아니라면 그 중 하나에 충실하십시오.

+2

그러나 UTF-16은 UTF-8보다 (올바르게) 처리하기가 쉽지 않습니다. 둘 다 다중 요소 코드 포인트를 처리해야합니다. –

+0

@Ben Voigt : 네 저는 서로 게이트 쌍을 다루어야하기 때문에 UTF-16을 제대로 처리하는 데 열심입니다. 따라서 개인적으로 UTF-32를 선호합니다. 하지만 UTF-16은 BMP (> 16 비트)가 아닌 코드 포인트 만 처리하기 때문에 UTF-8보다 훨씬 쉽습니다.서로 게이트 쌍이 많은 시간을 변경하는 것을 방지하는 한, 올바르게 표시되지 않는다는 간단한 경고가 충분할 수 있습니다 (sandscript 등을 다루지 않는 한). –

+0

주 : UTF-32는 32 비트이지만. 그들은 15 개 이상의 보충 평원을 사용하지 않기로 합의 했으므로 기술적으로 모든 캐릭터를 20 비트로 만들 수 있습니다. 첫 번째 외계인 접촉에 내기를 걸었지만 평원이 두 개 더 필요합니다. 현재 보충 평원에 할당 된 것들에 대해서는 [here] (http://en.wikipedia.org/wiki/Unicode_plane)를 참조하십시오. (CJK의 일부 확장 기능으로 중국에 사과해야합니다. 여기에)). –