2017-02-11 7 views
0

내 응용 프로그램에 boost::filesystem의 래퍼를 만듭니다. 파일 이름에 비 ASCII 문자가 있으면 어떻게 될지 조사하고 있습니다.`char`와 2 바이트 문자 사이에서 파일 이름은 어떻게 작동합니까?

Windows에서 the documentation은 모든 문자가 wchar_t이라고 말합니다. 그것은 매우 이해할 만하고 일관된 것입니다.

그러나 Linux의 경우 the documentation은 모든 문자가 !라고 말합니다. 그래서 1 바이트 문자. 궁금 해서요, 심지어 비 ASCII 문자를 읽고 작동합니까? 그래서 나는 아랍어 이름 تجريب (5 글자 단어)을 가진 디렉토리를 만들고 boost::filesystem으로 읽습니다. 나는 터미널에서 그것을 인쇄했다. 그리고 그것은 잘 작동했다. (터미널과 터미네이터는 별개로 왼쪽에서 오른쪽으로 잘못 썼다.) 터미널에서 인쇄 된 결과는 다음과 같습니다.

/mnt/hgfs/D/تجريب 

무언가가 더해지지 않습니다. 어떻게 이것이 1 바이트 char 문자열 일 수 있으며 여전히 아랍어 이름을 인쇄 할 수 있습니까? 그래서 나는 다음과 같은 한 :

std::for_each(path.string().begin(), path.string().end(), [](char c) { 
    std::cout<<c<<std::endl; 
}); 

그리고이 path 내가 위에서 언급 한 디렉토리입니다 준 실행했다 :

/ 
m 
n 
t 
/
h 
g 
f 
s 
/
D 
/
� 
� 
� 
� 
� 
� 
� 
� 
� 
� 

그리고이 시점에서

, 나는 정말, 정말 잃었어요. 아랍어 단어는 10 바이트로 5 글자 단어를 만듭니다.

여기 내 질문이 있습니다. : 문자의 일부는 1 바이트이고 문자의 일부는 2 바이트입니다. 리눅스는 2 문자가 단일 2 바이트 문자라는 것을 어떻게 알 수 있습니까? 이것은 파일 시스템을 위해 리눅스에서 2 바이트 문자를 가질 필요가 없다는 뜻입니까? char은 모든 언어에 적합합니까?

누군가가 어떻게 작동하는지 설명해주세요.

+0

어떻게'/ mnt/hgfs/D/تجريب' 출력을 생성 했습니까? 'ls' 사용하기? –

+0

[UTF-8] (https://en.wikipedia.org/wiki/UTF-8)입니다. – Fanael

+0

@ πάνταῥεῖ'std :: cout << 경로 << std :: endl;' –

답변

0

확인. 대답은 이것이 UTF-8 인코딩이며, 이것은 디자인에 따라 가변 길이입니다. Wikipedia 있음, 내 질문에 대한 대답 : "리눅스 어떻게 그 두 문자가 단일 2 바이트 문자 알고 있습니까?"

대답은 거기에서 인용 : UTF-8로 비 ASCII 코드 포인트를 인코딩 할 때 ASCII 바이트 이후

가 발생하지 않는, UTF-8은 해석 대부분의 프로그래밍 및 문서 언어에서 사용하는 것이 안전합니다 특정 ASCII 문자 (예 : 문자열 끝).

문자를 해석 할 때 모호성이 없습니다.