아래와 같이 일부 문자를 전자 형식으로 변환하려고 합니다.
tr 'abcdefghijklmnopqrstuvwxyz' 'abcdefghijklmnopqrstuvwxyz'
그러나 이것은 작동하지 않습니다. 검색해서 찾아보니tr
UTF-8은 지원되지 않습니다.. 그래서 그 질문에 대한 대답을 바탕으로 Perl을 사용해 보았습니다.
perl -C -pe 'tr/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/'
하지만 여전히 도움이 되지 않습니다. 나는 더 간단한 버전을 시도했다
$ echo abca | perl -C -pe 's/a/a/g'
ï½bcï½
$ echo abca | perl -C -pe 'tr/a/a/'
ïbcï
Perl은 여전히 멀티바이트 UTF-8 문자를 바이트로 처리하는 것 같습니다.
이 문자를 올바르게 변환하려면 어떻게 해야 합니까?
답변1
GNU와 BSD는 둘 다 sed
적절한 로케일에서 멀티바이트를 인식합니다.y
명령은 다음과 유사합니다.tr
:
$ echo hello | sed -e 'y/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/'
hello
로케일이 UTF-8이면 실행 가능한 대부분의 위치에서 작동합니다.
Perl 문제는 멀티바이트 문자를 바이트로 처리하는 것만큼 간단하지 않습니다. 입력을 매우 잘 이해하고 출력을 인코딩하기도 합니다.소스 코드이해하지 못합니다:
$ echo abc | perl -C -pe 'tr/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/'|hexdump -C
00000000 c3 af c2 bd c2 81 0a |.......|
"a"의 UTF-8 인코딩은 ef bd 81
"b"를 두 번째 바이트로 처리한 다음 출력 시 인코딩을 시도하고 "c"에도 동일하게 적용되는 것을 볼 수 있습니다. 너use utf8
Perl(5) 소스 코드 자체를 이 방식으로 인코딩해야 합니다 .; -C
프로그램이 실행 중일 때만 IO를 제어합니다.
use utf8;
문자열 을 입력 -e
하거나-Mutf8
명령줄에서 사용:
$ echo abc | perl -C -Mutf8 -pe 'tr/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/'
abc
Perl 6은 많은 문제처럼 이 문제를 해결하지만...