다음은 유니 코드 문자열에서 대문자 주위에 괄호를 추가하는 간단한 대체입니다. 보시다시피 결과는 다소 추합니다.
~$ echo "Whatéver 5" | perl -ape "s/(\p{Upper})/(\1)/g"
(W)hat(�)�ver 5
내 이해는 정규식이 "논리 문자"대신 "코드 포인트"에서 작동하여 내 'é'를 의미없는 문자로 분할한다는 것입니다. 정규식이 논리적 유니 코드 문자에 대해 한 번에 작동하도록하는 방법이 있습니까?
감사,
터미널이 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에서 경고가 표시되지 않는 것 같습니다 . 또한 범위 바이트 0xC0
에 0xDE
대문자 속성을 일치합니다. 시험
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) 0xC3
및 0xA9
로 표시되며 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] 삭제
몇 마디 만하겠습니다