논리 유니 코드 문자의 Perl 정규식 대체

나단 코헨

다음은 유니 코드 문자열에서 대문자 주위에 괄호를 추가하는 간단한 대체입니다. 보시다시피 결과는 다소 추합니다.

~$ echo "Whatéver 5" | perl -ape "s/(\p{Upper})/(\1)/g"
(W)hat(�)�ver 5

내 이해는 정규식이 "논리 문자"대신 "코드 포인트"에서 작동하여 내 'é'를 의미없는 문자로 분할한다는 것입니다. 정규식이 논리적 유니 코드 문자에 대해 한 번에 작동하도록하는 방법이 있습니까?

감사,

Håkon Hægland

터미널이 UTF-8 인코딩을 사용한다고 가정하면,

$ echo -n "é" | perl -ne 'printf "%vX\n", $_'

준다

C3.A9

따라서 Perl 프로그램에 대한 입력은 내부적으로 유니 코드로 변환되지 않았습니다 (여전히 UTF-8 바이트의 문자열 임).

입력을 Perl 문자열로 변환하려면 옵션을 사용하여 표준 입력 스트림에 UTF-8 레이어를 추가합니다 -CI.

$ echo -n "é" | perl -CI -ne 'printf "%vX\n", $_'

출력은 이제

E9

그러나 문자를 다시 표준 출력으로 인쇄하려고 하면 터미널에서 é유니 코드 대체 문자 얻을 수 없습니다 . 이는 문자 0xE9가 유니 코드이지만 터미널이 UTF-8을 예상하고 0xE9유효한 UTF-8이 아니기 때문입니다.

$ echo -n "é" | perl -CI -nE 'printf "$_: %vX\n", $_, $_'
�: E9

올바른 출력을 얻으려면 표준 출력 스트림에도 UFT-8 인코딩 레이어를 추가 할 수 있습니다 ( -CO플래그 사용 ) :

$ echo -n "é" | perl -CIO -nE 'printf "$_: %vX\n", $_, $_'
é: E9

perlunicode 에 따르면

"Upper"는 "Uppercase"의 동의어이며 \ p {Uppercase}를 \ p {Upper}와 동일하게 작성할 수 있습니다.

예를 들어, \ p {Uppercase}는 유니 코드 "Uppercase"속성이있는 단일 문자와 일치합니다.

\p{Upper}바이트 문자열에서 사용하려고하면 Perl에서 경고가 표시되지 않는 것 같습니다 . 또한 범위 바이트 0xC00xDE대문자 속성을 일치합니다. 시험

perl -E 'for $i (0x80..0xFF) {$_=chr $i; printf "%x\n", $i if /\p{Upper}/}'

이것은 당신이 얻은 출력을 설명합니다.

$ echo "Whatéver 5" | perl -ape "s/(\p{Upper})/(\1)/g"
(W)hat(�)�ver 5

여기서 문자 é는 2 바이트 (UTF-8) 0xC30xA9로 표시되며 0xC3유니 코드 Upper속성 과 일치합니다 .

따라서 문제에 대한 해결책은 표준 입력 및 출력에 UTF-8 인코딩 레이어를 추가하는 것입니다 (를 결합 -CI하여 -CO사용할 수 있음 -CS).

echo "Whatéver 5" | perl -CS -ape "s/(\p{Upper})/(\1)/g"

출력 포함 :

(W)hatéver 5

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

정규식에 유니 코드 (히브리어 문자) 사용

분류에서Dev

정규식 유니 코드 문자

분류에서Dev

VS 코드 스 니펫의 중첩 정규식 대체

분류에서Dev

유니 코드 정규식의 특정 문자 클래스 부분에 대한 길이 제한 설정

분류에서Dev

Perl 정규식의 대체 명령?

분류에서Dev

정규식의 범위로 유니 코드 문자 지원

분류에서Dev

유니 코드 문자열의 정규식

분류에서Dev

Excel VBA의 유니 코드 문자에 대한 정규식과 일치하지 않음

분류에서Dev

Emacs 정규식의 유니 코드

분류에서Dev

여는 태그와 닫는 태그 사이의 유니 코드를 대체하는 정규식

분류에서Dev

유니 코드 문자가있는 제목 대소 문자 또는 ALLCAPS와 일치하는 정규식

분류에서Dev

정규식에 유니 코드 문자 지정

분류에서Dev

정규식 대체의 문자 인코딩

분류에서Dev

정규식 유니 코드 문자에 대한 클라이언트 측 유효성 검사

분류에서Dev

Perl-메타 문자를 정규식으로 대체

분류에서Dev

유니 코드가있는 정규식 패턴은 대소 문자 접기를 수행하지 않습니다.

분류에서Dev

유니 코드 문자 대체?

분류에서Dev

유니 코드 문자 대체?

분류에서Dev

유니 코드 문자를 정규식과 일치

분류에서Dev

정규식없이 유니 코드 문자열 분할

분류에서Dev

유니 코드 문자열이있는 Python 정규식

분류에서Dev

조건부 논리 문자열에 대한 구문 분석 및 정규식

분류에서Dev

Perl의 if 문 내에서 논리적 AND로 구분 된 여러 정규식 그룹을 캡처하는 방법은 무엇입니까?

분류에서Dev

정규식 문자의 최대 길이가 처리 할 수 있습니까?

분류에서Dev

파일의 특수 문자를 유니 코드 코드로 대체 (Python)

분류에서Dev

Java 정규식에서 유니 코드 기호 처리

분류에서Dev

Perl에서 정규식 대체의 예기치 않은 결과

분류에서Dev

Perl 정규식을 사용하여 특정 문자열의 전체 행에서 특정 문자를 제거하는 방법은 무엇입니까?

분류에서Dev

Python 2.7 re에서 8 자리 유니 코드 정규식 범위를 컴파일 할 수 없습니다.

Related 관련 기사

  1. 1

    정규식에 유니 코드 (히브리어 문자) 사용

  2. 2

    정규식 유니 코드 문자

  3. 3

    VS 코드 스 니펫의 중첩 정규식 대체

  4. 4

    유니 코드 정규식의 특정 문자 클래스 부분에 대한 길이 제한 설정

  5. 5

    Perl 정규식의 대체 명령?

  6. 6

    정규식의 범위로 유니 코드 문자 지원

  7. 7

    유니 코드 문자열의 정규식

  8. 8

    Excel VBA의 유니 코드 문자에 대한 정규식과 일치하지 않음

  9. 9

    Emacs 정규식의 유니 코드

  10. 10

    여는 태그와 닫는 태그 사이의 유니 코드를 대체하는 정규식

  11. 11

    유니 코드 문자가있는 제목 대소 문자 또는 ALLCAPS와 일치하는 정규식

  12. 12

    정규식에 유니 코드 문자 지정

  13. 13

    정규식 대체의 문자 인코딩

  14. 14

    정규식 유니 코드 문자에 대한 클라이언트 측 유효성 검사

  15. 15

    Perl-메타 문자를 정규식으로 대체

  16. 16

    유니 코드가있는 정규식 패턴은 대소 문자 접기를 수행하지 않습니다.

  17. 17

    유니 코드 문자 대체?

  18. 18

    유니 코드 문자 대체?

  19. 19

    유니 코드 문자를 정규식과 일치

  20. 20

    정규식없이 유니 코드 문자열 분할

  21. 21

    유니 코드 문자열이있는 Python 정규식

  22. 22

    조건부 논리 문자열에 대한 구문 분석 및 정규식

  23. 23

    Perl의 if 문 내에서 논리적 AND로 구분 된 여러 정규식 그룹을 캡처하는 방법은 무엇입니까?

  24. 24

    정규식 문자의 최대 길이가 처리 할 수 있습니까?

  25. 25

    파일의 특수 문자를 유니 코드 코드로 대체 (Python)

  26. 26

    Java 정규식에서 유니 코드 기호 처리

  27. 27

    Perl에서 정규식 대체의 예기치 않은 결과

  28. 28

    Perl 정규식을 사용하여 특정 문자열의 전체 행에서 특정 문자를 제거하는 방법은 무엇입니까?

  29. 29

    Python 2.7 re에서 8 자리 유니 코드 정규식 범위를 컴파일 할 수 없습니다.

뜨겁다태그

보관