POSIX에는 다음과 같이 정의된 "문자 클래스"가 있습니다.LC_CTYPE 로케일 정의다음과 같은 (12) 이름이 있습니다:
alnum alpha blank cntrl digit graph lower print punct space upper xdigit
로 사용됩니다 [[:lower:][:digit:]]
.
각각은 매우 정확한 문자 목록을 정의하도록 설정됩니다.
예를 들어 digit
문자만 포함해야 합니다 0123456789
.
그러나 시간이 지나면서 사용하게 되면a의 정확한 정의는 digit
계속해서 바뀌고 있습니다.. Perl은 분명히 .Grep 이상과 일치 0123456789
할 수 있습니다 0123456789
.
$ echo '0123456789 ٠١٢٣٤٥٦٧٨٩ ۰۱۲۳۴۵۶۷۸۹ ߀߁߂߃߄߅߆߇߈߉ ०१२३४५६७८९' |
grep -o '[0-9]\+'
0123456789
٠١٢٣٤٥٦٧٨
۰۱۲۳۴۵۶۷۸
߀߁߂߃߄߅߆߇߈
०१२३४५६७८
이는 일반적으로 사용되는 문자의 국제화에 대한 압력으로 인해 발생합니다. 예: 그리스 국민의 경우 αβγδεζηθικλμνξοπρσςτυφχψω
다음과 같이 간주합니다.줄이다대문자와 소문자. 그러나 이것은 정의된 것이 아닙니다. 실제로 이러한 모든 "문자 클래스"에는 이러한 제한이 추가됩니다.POSIX 페이지 정의:
POSIX 로캘에서
이는 문자 클래스가 C 로케일에서만 정의되고 유효함을 나타냅니다.
이는 안정적이고 잘 정의된 문자 목록이 필요한 프로그래머에게 가장 유용합니다.
이는 프로그래머에게 합리적으로 보이는 것만을 [0-9]
의미할 수 있습니다 . 다시 말하지만, 이는 프로그래머에게만 의미가 있는 것 같습니다 . 그러나 "소문자"라고 읽는 경우 그리스 국민에게는 문자를 포함하지 않는 것이 불합리해 보일 것입니다 . 이는 조합 순서 사용자(C 제외)에게는 불합리해 보일 수 있지만, 이는 순진한 사용자에게는 예상치 못한 일일 수 있습니다. 많은 사용자들이 범위에 대문자가 포함되어 있다고 불평했습니다.0123456789
[a-z]
abcdefghijklmnopqrstuvwxyz
[a-z]
αβγδεζηθικλμνξοπρσςτυφχψω
[a-z]
aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYz
[a-z]
간단히 말해서 문자 클래스는 C 로캘에 대해서만 정의됩니다.
나머지 로케일은 아직 정의되지 않았으므로 사용할 수 없습니다. 그리스어에는 소문자를 요구할 수 없습니다. 또는 문자 범위 내에 포함시키십시오. 웹페이지에서 모든 언어를 쉽게 사용할 수 있는 오늘날의 컴퓨터 세계에서는 이는 충격적인 일이다.
이제 이를 개선할 수 있습니다.
현재의 다양성을 제한하려는 설명은 실패할 가능성이 높습니다. 새로운 구문이 필요합니다. 문자 클래스를 확장하여 문자 클래스가 원하는 의미를 정확하게 작성하면 어떻게 될까요?
Only digits from ASCII: [:as:digit:] <==> 0123456789
Only digits from English: [:en:digit:] <==> 0123456789
Only digits from Persian (Farsi): [:fa:digit:] <==> ۰۱۲۳۴۵۶۷۸۹
Only lowercase letters from English: [:en:lower:] <==> abcdefghijklmnopqrstuvwxyz
Only lowercase letters from Greek: [:el:lower:] <==> αβγδεζηθικλμνξοπρσςτυφχψω
Only uppercase from Russian: [:ru:upper:] <==> БВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ
.
.
etc.
모든/모든 로케일에서 안정적이고 동일합니다(로케일이 문자를 인코딩할 수 있는 경우).
일부 유틸리티(grep, sed, bash 등)에서 이 아이디어를 구현하려면 누구에게 연락해야 합니까?
답변1
이 문제는 POSIX에서 와이드 문자 기능을 사용하여 해결되었습니다. 에서 시작하다<wctype.h>
그리고<wchar.h>
, 이는 다음과 관련이 있습니다.현재 로케일, 그리고<locale.h>
이것이 어떤 로케일인지 지정하는 데 사용됩니다.
정규식에서 관련되지 않은 여러 로케일을 참조하기 위해 특수 구문을 추가해야 할 필요성을 발견한 사람은 아무도 없는 것 같습니다.
답변2
일부 유틸리티(grep, sed, bash 등)에서 이 아이디어를 구현하려면 누구에게 연락해야 합니까?
이미 일정 수준의 지원이 이루어졌습니다. 예를 들어 "é"는 프랑스어 로케일에서 소문자로 인식되고 "α"는 GNU C 라이브러리 및 해당 로케일 정의를 사용하는 시스템에서 그리스어 로케일의 소문자로 인식됩니다.GNU C 라이브러리에 정의된 페르시아어는 0123456789를 사용합니다.어떤 경우에는(특히 modifiers scanf
의 경우 ) "숫자" 범주에 속하지 않지만 Sharif FarsiWeb은 이와 관련하여 무엇을 하고 있는지 알고 있는 것 같습니다.printf
I
오늘날 그러한 변화를 제안하는 것은 다소 복잡합니다. 언제든지 참여할 수 있습니다오스틴 그룹그곳에서 문제를 논의하거나메일링 리스트또는버그 추적기(이상적으로는 잠시 동안 메일링 리스트에 숨어 있거나 아카이브를 읽는 것부터 시작하십시오.) 그러나 POSIX는 실제로 시도해 볼 수 있는 곳이 아닙니다.운전하다기존 구현 없이도 변경할 수 있습니다. 관련된 다양한 도구의 개발자에게 변경 사항을 제안할 수 있습니다. 아마도 일부 C 라이브러리 또는 기타의 로케일 정의부터 시작할 수 있지만 긴급한 상황(일반적으로 표준 요구 사항)이 없으면 너무 멀리 가져갈 가능성이 없으며 종료됩니다. 캐치 22 상황에 빠졌습니다.
오늘날 가장 좋은 선택은 대형 OS 편집자의 중요한 고객을 위한 유효한 사용 사례를 제시하고 그러한 방식으로 변화를 추진하는 것입니다. 그러면 편집자가 귀하를 대신하여 모든 커뮤니티 논쟁을 처리합니다.