2014-07-01 2 views
1

getline 기능을 사용하는 Unicode 문자뿐만 아니라 ASCII을 갖는 C++에서 fstream을 사용하여 파일을 읽어야합니다.
그러나이 함수는 std::string 만 사용하며이 간단한 문자열의 문자는 char32_t으로 변환 할 수 없으므로 유니 코드 문자와 비교할 수 있습니다. 그러니 어느 누구라도 문제를 해결해 줄 수 있습니다.std :: string을 char32_t (유니 코드 문자)로 변환

+0

"유니 코드 문자"라고 할 때 인코딩은 무엇입니까? UTF-8이면 더 이상 할 일이 없습니다. –

+0

어떤 진전을 만들기 전에 텍스트 인코딩이 무엇인지 알아야합니다. 당신이 그것을 알기 전까지는, 아무 것도하지 않는 것이 무의미합니다. –

답변

0

char32_t는 거의 사용되지 않는 UTF-32 인코딩에 해당합니다. 파일이 UTF-32로 인코딩되어 있습니까?

확실한 경우 문자열을 저장하려면 std::u32string을 사용해야합니다. 읽으려면 예를 들어 std::basic_stringstream<char32_t>을 사용할 수 있습니다. 그러나 일반적으로 이러한 유형은 제대로 지원되지 않습니다.

  • 플랫폼 고유의 16 비트 또는 32 비트의 부호화 (등 ..., 웹 페이지)

    • UTF-8 텍스트 파일을 :

      유니 코드는 일반적으로 사용하여 인코딩 프로그램에서 wchar_t 유형을 사용합니다.

    일반적으로 보편적으로 인코딩 된 파일은 UTF-8 형식입니다. 이들은 1 (ASCII 문자)에서 4까지의 문자 인코딩에 가변 바이트 수를 사용합니다. 즉, std :: string을 사용하여 개별 문자를 직접 테스트 할 수 없습니다.

    이렇게하려면 UTF-8 문자열을 wchar_t 문자열로 바꾸고 std::wstring에 저장합니다. 이를 위해

    는 다음과 같이 정의 된 변환기를 사용

    std::wstring_convert<std::codecvt_utf8<wchar_t> > converter; 
    

    을 그리고 그와 같은 변환 :

    std::wstring unicodeString = converter.from_bytes(utf8String); 
    

    그런 다음 각각의 유니 코드 문자를 액세스 할 수 있습니다. 각 문자열 리터럴 앞에 "L"을 넣어서 유니 코드 문자열 리터럴로 만드는 것을 잊지 마십시오. 예 :

    if(unicodeString[i]==L'仮') 
    { 
        info("this is some japanese character"); 
    } 
    
  • +0

    주의 : 리눅스에서 wchar_t는 실제로 UTF-32이지만, 의존하지 않아야합니다. – galinette

    +0

    wchar_t는 플랫폼에 종속적이므로 유니 코드 문자를 저장할 수 있다고 보장 할 수 없으므로 사용하지 마십시오. – Erbureth

    +1

    완전히 다른 것. 유니 코드 코드 포인트를 저장하려면 * 32 비트 유형이 필요합니다. – Erbureth

    관련 문제