2014-01-30 11 views
3

C++ (11)는 도입 윈도우 파일 경로, 정규식 표현 등과 같은 특수 기호를 많이 인용 된 문자열 리터럴을 표현하는 것이 매우 유용 할 수 raw string literals ...원시 문자열 리터럴 및 파일 목록 화는

std::string path = R"(C:\teamwork\new_project\project1)"; // no tab nor newline! 
std::string quoted = R"("quoted string")"; 
std::string expression = R"([\w]+[ ]+)"; 

auto message = R"(Pick up a card)";   // raw string 1 
auto cards = R"()"; // raw string 2 
이 원시 문자열 리터럴도 더 인코딩 접두사가 지정되지 않은 인코딩 접두사 ( u8, u, U, 또는 L), 그러나,와 결합 될 수있다, 나는이 코드를 가지고 있다고 가정하자?, 파일 인코딩 문제를 않습니다 ,

내가 작성하고, 위의 코드를 저장할 수있는 경우 명백한 내 소스 코드를 유니 코드로 인코딩됩니다, 그래서 궁금하네요 것을 :

  • raw string 1 리터럴 유니 코드 것입니까? (ASCII 문자 만 사용함), 즉 원시 문자열은 파일의 코드화를 상속합니까? 아니면 컴파일러는 파일 인코딩에 관계없이 유니 코드가 필요하지 않다고 자동 감지합니까?
  • raw string 2의 인코딩 접두어 U이 유니 코드 리터럴로 처리 되려면 필요하며 그렇지 않으면 내용 및/또는 소스 파일 인코딩으로 인해 유니 코드가 자동으로 필요합니까?

감사합니다.

template<typename T> std::string demangle(T t) 
{ 
    int status; 
    char *const name = abi::__cxa_demangle(typeid(T).name(), 0, 0, &status); 
    std::string result(name); 
    free(name); 
    return result; 
} 

int main() 
{ 
    auto message = R"(Pick up a card)"; 
    auto cards = R"()"; 

    std::cout 
     << "message type: " << demangle(message) << '\n' 
     << "cards type: " << demangle(cards) << '\n'; 

    return 0; 
} 

출력 :

message type: char const*

EDIT : 코드 위에서 ideone.com 및 messagecards 변수 분해 해제 형 인쇄, 그것이 출력 char const* 테스트

내가 생각했던 것보다 훨씬 가장 이상한 cards type: char const*

, 나는 유형이 wchar_t (심지어 L 접두사없이)이 될 것이라고 확신했다.

+0

표준의이 부분은 매우 어둡습니다. GCC와 MSVC에서 문자열은 따옴표 사이의 바이트가 될 것이라고 생각합니다. – Simple

+0

@Simple "* 문자열은 따옴표 사이의 바이트가됩니다 *"그래서 ... 이것은 소스 파일 인코딩을 암시합니다 : O –

답변

1

예, 소스를 컴파일하는 경우에도 중요합니다. gcc을 사용하는 경우 컴파일시 -finput-charset=UTF-16과 같은 속도감을 사용해야합니다 (VS와 동일한 것을 적용해야합니다).

하지만 IHMO, 코드에서 고려해야 할 기본 사항이 있습니다. 예를 들어, std::stringchar의 컨테이너이며 1 바이트 큽니다. 예를 들어 UTF-16을 다루는 경우 2 바이트가 필요합니다. 따라서 '직접 변환'에도 불구하고 적어도 wchar_t (std :: wstring)이 필요합니다 (또는 char16_t , 더 안전 할 C++11에서).

유니 코드를 사용하려면 컨테이너와 유니 코드 코드 소스를 처리 할 수있는 컴파일 환경이 필요합니다.

+0

'원시 리터럴 1 '과'raw 리터럴 2'는 어떤 컨테이너에도 저장되지 않습니다 , 추론 된 유형 변수에 저장됩니다. 나는 예제에서 그런 식으로했기 때문에 어떤 종류의'std :: basic_string'이 최선의 선택인지는 확실하지 않았습니다. –

+0

@ PaperBirdMaster 당신의 관찰이 매우 중요하다고 생각합니다. 나는 그것을 시험 할 것이다! –

1

원시 문자열 리터럴은 이스케이프 처리 방식을 변경하지만 인코딩 처리 방식은 변경하지 않습니다.원시 문자열 리터럴은 원본 인코딩에서 내용을 변환하여 적절한 실행 인코딩으로 문자열을 생성합니다.

문자열 리터럴 유형과 적절한 실행 인코딩은 접두사로 전적으로 결정됩니다. R 만 항상 좁은 실행 인코딩에서 char 문자열을 생성합니다. 소스가 UTF-16이고 컴파일러가 소스 인코딩으로 UTF-16을 지원하면 컴파일러는 문자열 리터럴 내용을 UTF-16에서 좁은 실행 인코딩으로 변환합니다.