2017-01-20 1 views
1

plain string 부호화의 종류를 갖는다 :utf-8과 일반 문자열을 플랫폼 독립적으로 변환 할 수있는 방법이 있습니까? 여기

  • 평범 문자 스트링 같은 "plainstring"만큼 인코딩;

  • 모든 표준 라이브러리가 반환하거나 수락합니다. 예를 들어 : 내가 아는 한


std::cout << "I'm ok." ; // plain string, ok on my system, 
          // VS2015 x64 default encoding setting. 
std::cout << u8"I'm wrong."; // got error display on my system 

std::experimental::filesystem::path path("Some Right specified Path contains non-ASCII chars"); // ok 

std::experimental::filesystem::path path2(u8"Some Path specified Path contains non-ASCII chars"); // error 

std::experimental::filesystem::directory_iterator r(path); // ok 

std::experimental::filesystem::directory_iterator r2(path2); // will throw exception 

, 내 SYSYTEM (창 10 64)은 같은 일반 문자열 GB2312 인코딩을 사용합니다.

그러나 플랫폼 독립적 인 방법으로 utf-8과 같은 다른 인코딩으로 변환하고 변환하는 방법은 무엇입니까 ??

+0

'expermantal'대신 'experimental'을 사용합니까? – Danh

+0

나는 그들을 수정했다. – ChungkingExpress

+0

BOM을 사용하여 utf-8에 소스 파일을 저장하려고 했습니까? – Danh

답변

0

이것은 간단하게 들리는 질문이지만 실제로는 매우 복잡한 문제입니다.

짧은 대답 : GB2312에서 UTF-8로 왕복 한 다음 GB2312로 돌아갈 수는 있지만 UTF-8에서 GB2312로 왕복 변환을 한 다음 UTF-8로 되돌릴 수는 없습니다.

더 긴 답 : 표준 호환 방식으로 표현할 수있는 문자열은 유니 코드로 표현할 수 있으며 유니 코드로 표현할 수있는 문자열은 모두 UTF-8로 인코딩 할 수 있습니다.

반대의 경우는 사실이 아닙니다. 임의의 유니 코드 문자열을 다른 (표준) 인코딩으로 변환 할 수 없습니다.

유니 코드는 1,114,112 코드 포인트를 포함합니다. 이 많은 다른 점을 나타 내기 위해서는 적어도 3 바이트가 필요합니다. UTF-8은 이러한 코드 포인트를 나타낼 수 있습니다.

GB2312 (AKA Simplified Chinese)는 6000 + 코드 포인트를 포함하므로 GB2312에 해당 항목이없는 많은 유니 코드 코드 포인트가 있습니다. 이것이 UTF-8에서 GB3213 인코딩이 항상 손실이되는 이유입니다. 따라서 이론적으로 왕복 전환은 불가능합니다.

UTF-8에서 GB2312까지의 "최선형"변환기가 있기 때문에 플랫폼에 독립적이어서는 안됩니다. UTF-8 to GB2312 conversion의 Google 검색은 대부분의 특정 플랫폼에 의존하지 않는 많은 가능성을 찾습니다.

이 검색을 수행하고 필요에 맞는 결과를 선택하는 것이 좋습니다. 인코딩 사이의 변환에

하나의 플랫폼 독립적 인 솔루션은 당신을 위해 무엇을 할 수 있는지에 대한 완전한 설명은 내가 여백을 사용하는 경우에도 < 유머 > 대답 스택 오버플로에 딱 맞는 것 이상이다 boost.locale이다. </유머 >.

추가 읽기 : this page provides useful background information for understanding string encoding issues.

+0

음. 조언 해 주셔서 감사합니다.어쨌든, UTF-8과 GB2312 사이의 변환 방법에 대해서는 이야기하고 있지 않지만 UTF-8과 "일반 문자열을 사용하는 모든 문자열을 사용하는 인코딩"을 변환하는 방법, 특히 제 컴파일러는 GB2312입니다. . 모든 플랫폼에서 코드가 올바르게 실행되도록 플랫폼 독립적 인 방식으로이 작업을 수행해야합니다. – ChungkingExpress

관련 문제