"POSIX 로케일에서"는 무엇을 의미합니까?

"POSIX 로케일에서"는 무엇을 의미합니까?

~ 안에이 질문다음과 같은 의견이 있습니다.

이 모든 것은 "POSIX 로케일에서"가 무엇을 의미하는지 이해하지 못하는 데서 비롯됩니다. (-: 그리스어 소문자를 sed 및 [[:lower:]] 및 편리한 el_GR.UTF-8 로케일 세트와 일치시키는 것을 시도해야 합니다. – JdeBP

그렇다면 "POSIX 로케일에서"는 무엇을 의미합니까?

보너스: C 이외의 로케일의 POSIX에서 이것이 유효합니까?

LC_ALL=C grep '[[:lower:]]' file

답변1

POSIX가 다음과 같이 말할 때(“상위”에 대해)

POSIX 로케일에서는 다음만 가능합니다.

ABCDEFGHIJKLMNOPQRSTU VWXYZ

다음이 포함됩니다:

POSIX 로케일을 정의하고 있습니다. 이는 POSIX 로케일의 맥락에서 "상위" 문자 클래스가 나열된 문자로만 구성됨을 의미합니다.

POSIX는 다른 로케일을 정의하지 않지만 시스템에서는 자유롭게 정의할 수 있습니다. 결과적으로 grep '[[:lower:]]' filePOSIX로만 제한하면 POSIX 이외의 로케일에서 유용한 작업을 수행할 수 없습니다 . 그러나 많은 시스템에서는 다른 로캘과 해당 문자 클래스를 정의합니다. 예를 들어, GNU C 라이브러리의 로케일을 사용하는 시스템에서는

$ echo 'α' | LC_ALL=el_GR.UTF-8 grep '[[:lower:]]'
α

(이것은 el_GR.UTF-8로캘을 사용할 수 있다고 가정합니다. Debian 파생 버전에서는 이를 확인하는 빠른 방법은 패키지를 설치하는 것입니다 locales-all.)

답변2

(다른 질문에서) 귀하의 제안을 완전히 이해하지 못했습니다. 그러나 사용 사례를 잘못 해석한 것으로 보입니다.POSIX 로케일.

귀하의 제안은 로케일이 그리 좋지 않은 것 같습니다.사용자친숙한. 그리고 그렇게 되도록 조정되어야 합니다. 하지만사용자친절하다는 것은 posix 로컬의 요점이 아닙니다. 그것은 다른 규칙을 가진 다른 로케일의 작업입니다.

posix local의 작업은 예측 가능해야 합니다. 실제로 단순하다는 이점도 있습니다. 다른 언어를 표준에 포함시키기 시작하면 중단하기가 매우 어려우며, 그 결과 유지 관리가 많이 필요하고 구현하기 어려운 표준이 됩니다.

개발자로서 나는 모든 언어에 대한 모든 규칙을 알고 "알파벳순"으로 정렬하는 방법과 실제로 어떤 것이 대문자인지 소문자인지 알 수 있는 방법이 없습니다. 영어가 아닌 언어에 대한 규칙은 실제로 매우 복잡할 수 있습니다. 따라서 다른 모든 언어에 대한 규칙을 포함하도록 Posix 로컬을 조정하면 해당 동작을 실제로 예측할 수 없게 됩니다.

posix 로케일을 변경하면 이전 시스템이 최신 시스템의 동작과 일치하지 않는 소프트웨어에 실제로 심각한 영향을 미칠 수 있습니다. (아래 일화 참조)


일화

내가 본 버그 중 가장 모호하고 진단하기 어려운 버그 중 하나는ETL 도구행을 "무작위로" 삭제합니다. 힘든 분석 끝에 소프트웨어가 제대로 작동하는 것으로 나타났습니다. 하지만 LC_COLLATE=C로 실행하는 경우에만 가능했습니다. 이는 레코드를 일치시킬 때 자체 내부 정렬 순서와 일치하는 데이터베이스의 정렬 순서에 의존했기 때문입니다. 개발자들은 일부 로케일에서 숫자가 "-1, -2, 1, 2" 대신 "0, -1, 1, -2, 2" 알파벳순으로 텍스트를 정렬한다는 사실을 전혀 알아차리지 못했습니다.

사용자 상호 작용과는 별도로, 이는 시스템이 모든 시스템에 공통적일 수 있는 예측 가능한 방식으로 작동해야 한다는 진정한 필요성을 보여줍니다.

관련 정보