C 로케일은 ASCII 문자 집합을 사용하도록 정의되어 있으며 POSIX에서는 로케일을 변경하지 않고 문자 집합을 사용할 수 있는 방법을 제공하지 않습니다.
C 인코딩을 UTF-8로 전환하면 어떻게 되나요?
긍정적인 측면은 UTF-8이 모든 프로세스(시스템 데몬 포함)의 기본 문자 집합이 된다는 것입니다. C가 7비트 ASCII를 사용한다고 가정하기 때문에 일부 응용 프로그램이 충돌하는 것 같습니다. 그런데 이런 앱이 정말 존재하는 걸까요? 요즘 작성된 코드 중 상당수는 어느 정도 로캘과 문자 집합을 인식하고 있으며, 이를 수행할 수 있는 코드를 보면 놀랄 것입니다.오직7비트 클린 입력을 처리하며 UTF-8 지원을 통해 C를 수용하도록 쉽게 조정할 수 없습니다.
답변1
C 로캘은 기본 로캘이 아닙니다. 이는 "놀라운" 동작이 발생하지 않도록 보장되는 영역입니다. 많은 명령은 또는 로케일에서 보장된 형식(예 ps
: df
헤더, 형식) date
으로 출력 됩니다. 인코딩( )의 경우 ASCII 문자만 포함되도록 보장됩니다. 로캘 설정이 수정되면 많은 응용 프로그램이 예기치 않게 작동합니다. 예를 들어 입력을 이진 데이터로 처리하는 대신 잘못된 UTF-8로 거부할 수 있습니다.C
POSIX
LC_CTYPE
[:alpha:]
C
시스템의 모든 프로그램이 UTF-8을 사용하도록 하려면 기본 로케일을 UTF-8로 설정하십시오. 즉, 단일 인코딩으로 작동하는 모든 프로그램입니다. 일부 프로그램은 바이트 스트림에서만 작동하며 인코딩에는 관심이 없습니다. 일부 프로그램은 여러 인코딩으로 작동하며 로케일에 신경 쓰지 않습니다. 예를 들어 웹 서버 또는 웹 클라이언트는 각 연결의 헤더에서 인코딩을 설정하거나 읽습니다.
답변2
내 생각엔 당신이 조금 혼란스러워하는 것 같아요. "C 로케일"은 다른 로케일과 유사하며 지적한 대로 일반적으로 7비트 ASCII와 동의어입니다.
내 생각엔 이것이 C 라이브러리에 내장되어 있어서 라이브러리에 일종의 대체 기능이 있는 것 같습니다. 로케일을 갖지 않는 것은 불가능합니다.
그러나 이는 C 코드로 구성된 프로그램이 입력을 처리하는 방식과는 아무런 관련이 없습니다. 전달된 입력을 번역하는 데 사용되는 로케일도착하다실행 파일의 경우 시스템 로케일이 UTF-8이면 소스 코드가 C로 작성되었는지 다른 언어로 작성되었는지에 관계없이 프로그램은 UTF-8을 가져옵니다. 그래서:
7비트의 깔끔한 입력만 처리할 수 있고 UTF-8을 지원하는 C를 수용하도록 쉽게 조정할 수 없는 코드를 보면 놀랄 것입니다.
정말 말이 안 돼요. 표준 입력에서 읽는 최소 표준 C 소스 코드는 시스템으로부터 바이트 스트림을 받습니다. 시스템이 UTF-8을 사용하고 스트림이 일부 HID 하드웨어에서 생성된 경우 스트림에 UTF-8로 인코딩된 문자가 포함될 수 있습니다. 다른 곳(예: 네트워크, 파일)에서 가져온 경우 무엇이든 포함할 수 있습니다.가설UTF-8 표준이 유용합니다.
C 로케일이 UTF-8 로케일보다 훨씬 더 제한된 문자 집합이라는 사실은 그것과 아무 관련이 없습니다. 그냥 "C 로케일"이라고 부르지만 실제로는 다른 어떤 언어보다 C 코드 작성과 관련이 없습니다.
실제로 소스 코드에서 UTF-8 문자를 C 문자열로 하드코딩할 수 있습니다. 시스템이 UTF-8이라고 가정하면 생성된 실행 파일에서 사용할 때 이러한 문자열이 올바르게 표시됩니다.
귀하가 댓글에 게시한 "Roger Leigh" 링크는 확장 세트(UTF-8) 사용을 언급하고 있다고 생각합니다.~처럼임베디드 환경을 위한 C 라이브러리의 C 로케일이므로 추가 로케일을 로드할 필요가 없습니다.체계UTF-8을 처리합니다.
따라서 질문에 대한 대답은 "C 로케일이 ASCII가 아닌 UTF-8이면 어떻게 될까요?"입니다.추측하다, 아무것도 없지만 임베디드 환경 등 외부에서는 이 작업을 수행할 필요가 별로 없습니다. 그러나 어느 시점에는 GNU C와 같은 라이브러리의 표준이 될 가능성이 높습니다(내 생각에도 그럴 수도 있습니다).