C 로케일은 ASCII 문자 세트를 사용하도록 정의되어 있으며 POSIX는 로케일을 변경하지 않고 문자 세트를 사용하는 방법도 제공하지 않습니다.
C의 인코딩이 대신 UTF-8로 전환되면 어떻게됩니까?
긍정적 인 측면은 UTF-8이 모든 프로세스, 심지어 시스템 데몬의 기본 문자 세트가 될 것이라는 점입니다. 분명히 C가 7 비트 ASCII를 사용한다고 가정하기 때문에 중단되는 응용 프로그램이있을 것입니다. 그러나 이러한 응용 프로그램이 실제로 존재합니까? 현재 많은 작성된 코드가 어느 정도 로케일 및 문자 집합을 인식하고 있습니다. 7 비트 클린 입력을 만 처리 할 수 있고 쉽게 수용 할 수없는 코드를 보면 놀랄 것입니다. UTF-8 지원 C.
댓글
답변
C 로케일 기본 로케일이 아닙니다. “놀라운”동작을 일으키지 않도록 보장되는 로케일입니다. 여러 명령에 보장 된 형식의 출력이 있습니다 (예 : ps
또는 df
헤더, date
형식)을 C
또는 POSIX
로케일로 지정합니다. 인코딩 (LC_CTYPE
)의 경우 [:alpha:]
에 ASCII 문자 만 포함된다는 것이 보장됩니다. C
로케일이 수정 된 경우 많은 애플리케이션이 오작동합니다. 예를 들어, 이진 데이터로 처리하는 대신 유효하지 않은 UTF-8 입력을 거부 할 수 있습니다.
시스템의 모든 프로그램에서 UTF-8을 사용하려면 기본 로케일을 UTF-8로 설정하십시오. . 즉, 단일 인코딩을 조작하는 모든 프로그램입니다. 일부 프로그램은 바이트 스트림 만 조작하고 인코딩에 대해서는 “관심이 없습니다.”일부 프로그램은 다중 인코딩을 조작하고 로케일에 대해서는 관심이 없습니다 (예 : 웹 서버 또는 웹 클라이언트가 헤더의 각 연결에 대한 인코딩을 설정하거나 읽음).
답변
당신은 약간 혼란 스럽습니다. “C 로케일”은 다른 로케일과 마찬가지로, 일반적으로 7 비트 ASCII의 동의어입니다.
C 라이브러리에 내장되어 있으므로 라이브러리에는 일종의 폴 백이 있습니다. 로케일이있을 수 없습니다.
그러나 이것은 C 코드로 빌드 된 프로그램이 입력을 처리하는 방법과 관련이 없습니다. 로케일은 실행 파일로 전달 된 입력을 변환하는 데 사용됩니다. 시스템 로케일이 UTF-8 인 경우 UTF-8은 소스가 C로 작성되었는지 여부에 관계없이 프로그램이 가져 오는 것입니다. 그밖에. 따라서 :
7 비트 깨끗한 입력 만 처리 할 수 있고 UTF-8을 수용하도록 쉽게 조정할 수없는 코드를 보면 놀랄 것입니다. enabled C
정말 말이되지 않습니다. 표준 입력에서 읽는 최소한의 표준 C 소스는 시스템에서 바이트 스트림을 수신합니다. 시스템이 UTF-8을 사용하고 일부 HID 하드웨어에서 스트림을 생성 한 경우 해당 스트림에는 UTF-8 인코딩 문자가 포함될 수 있습니다. 다른 곳 (예 : 네트워크, 파일)에서 온 경우에는 어떤 것이 든 포함되어있을 수 있으므로 UTF-8 표준의 가정 이 유용합니다.
The C 로케일이 UTF-8 로케일보다 훨씬 더 제한된 문자 세트라는 사실은 관련이 없습니다. 그냥 “C 로케일”이라고 부르지 만 사실 다른 어떤 것보다 C 코드를 작성하는 것과 관련이 없습니다.
사실 UTF-8 문자를 c로 하드 코딩 할 수 있습니다. -strings in the source. 시스템이 UTF-8이라고 가정하면 결과 실행 파일에서 사용할 때 해당 문자열이 올바르게 표시됩니다.
내가 생각하는 댓글에 게시 한 “Roger Leigh”링크는 확장 된 집합 (UTF-8)은 시스템 이 처리 할 다른 로케일을로드 할 필요가 없도록 임베디드 환경을 대상으로하는 C 라이브러리의 C 로케일 과 같습니다. UTF-8.
그러므로 “C 로케일이 ASCII 대신 UTF-8이면 무엇이 깨질까요?”라는 질문에 대한 대답은 추측 입니다. 하지만 임베디드 환경 외부에서는 그렇게 할 필요가별로 없습니다.하지만 GNU C와 같은 라이브러리의 경우 언젠가는 표준이 될 가능성이 매우 높습니다 (그럴 수도 있습니다).
댓글
- 다양한 시스템 호출의 동작이 영향을받습니다. 예를 들어 «
isupper()
는 A- 움라우트 (Ä)를 기본 C 로케일의 대문자로 변환합니다. » ( man7.org/linux/man-pages/ man3 / isprint.3.html ).isprint()
는 C가 ASCII 전용으로 정의된다는 사실에 의해 영향을받는 또 다른 시스템 호출입니다. - 예, (이론적으로) 이들은 로케일이지만 해당 로케일은 일반적으로 UTF-8이며 반드시 ' C ' 일 필요는 없습니다. GNU에서는 '이 점에서 깨졌습니다. gnu.org/software/gnulib/manual/html_node/isupper. html Unix 시스템의 기본 사항은 모두 C로 코딩되어 있으므로 " C는 ' t handle UTF-8 "는 잘 작동합니다. 분명히 정확하지 않습니다. C로 작성된 프로그램이 UTF-8을 처리 할 수없는 경우 시스템에있는 UTF-8이 ' 없습니다 . 기간.
- Qv. POSIX isupper () 페이지 pubs.opengroup.org/onlinepubs/9699919799/functions/isupper.html " " C 로케일 iv id = “d0a984eeb2″가 아니라 프로세스의 현재 로케일 " >
. 이것은 ISO 표준에도 있으며 C 로케일 " 및 iv id에서 "를 참조합니다. = “d0a984eeb2″>
현재 로케일 " (일반적으로 현재 로케일이 다음과 같은 경우 " 형식) C 로케일 " 등. Linux를 사용하는 경우 GNU C '의 구현을 다시 한 번 명심하십시오. ctype 함수 중 일부가 손상되었습니다.
C.UTF-8
로케일이 있습니다. 및POSIX.UTF-8
.