C 로케일이 ASCII가 아닌 UTF-8이면 무엇이 중단됩니까?

C 로케일은 ASCII 문자 세트를 사용하도록 정의되어 있으며 POSIX는 로케일을 변경하지 않고 문자 세트를 사용하는 방법도 제공하지 않습니다.

C의 인코딩이 대신 UTF-8로 전환되면 어떻게됩니까?

긍정적 인 측면은 UTF-8이 모든 프로세스, 심지어 시스템 데몬의 기본 문자 세트가 될 것이라는 점입니다. 분명히 C가 7 비트 ASCII를 사용한다고 가정하기 때문에 중단되는 응용 프로그램이있을 것입니다. 그러나 이러한 응용 프로그램이 실제로 존재합니까? 현재 많은 작성된 코드가 어느 정도 로케일 및 문자 집합을 인식하고 있습니다. 7 비트 클린 입력을 처리 할 수 있고 쉽게 수용 할 수없는 코드를 보면 놀랄 것입니다. UTF-8 지원 C.

댓글

  • 2009 년 스레드 는 UTF-8 기반 C 로케일의 필요성에 대해 설명하지만 POSIX 중단 문제는 다루지 않습니다.
  • FWIW, OpenBSD에는 C.UTF-8 로케일이 있습니다. 및 POSIX.UTF-8.

답변

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 함수 중 일부가 손상되었습니다.

  • @gioele syscall이 아닌 라이브러리 함수입니다. Syscall은 커널에 대한 호출이며 로케일의 영향을받지 않습니다. 로케일은 순전히 사용자 수준으로 존재합니다.
  • @goldilocks It ' " Unix 시스템 기본 사항의 100 %는 C "로 코딩됩니다. 어떤 수준에서는 약간의 어셈블러 또는 어셈블리와 유사한 C가 아마도 있어야합니다. 예에는 부트 로더 로더 (오타 없음), 작업 전환의 실제 프로세스 및 유사한 저수준 기능은 거의 없습니다. 게다가 코드베이스 전체에서 C (또는 상위 수준의 언어)가 사용된다는 점에 동의합니다.
  • 답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다

    Deep Theme Powered by WordPress