이 명령 cut
에는 옵션이있는 -c
바이트 대신 문자를 처리하는 옵션이 -b
있습니다. 그러나 en_US.UTF-8
로케일 에서는 작동하지 않는 것 같습니다 .
두 번째 바이트는 두 번째 ASCII 문자를 제공합니다 (UTF-8과 동일하게 인코딩 됨).
$ printf 'ABC' | cut -b 2
B
UTF-8 로켈에서 세 개의 그리스어 비 ASCII 문자 중 두 번째를 제공하지 않습니다.
$ printf 'αβγ' | cut -b 2
�
괜찮습니다-두 번째 바이트 입니다.
따라서 두 번째 문자를 대신 살펴 봅니다 .
$ printf 'αβγ' | cut -c 2
�
깨진 것 같습니다.
일부 실험에서는 범위 3-4
에 두 번째 문자가 표시됩니다.
$ printf 'αβγ' | cut -c 3-4
β
그러나 그것은 바이트 3에서 4와 동일합니다.
$ printf 'αβγ' | cut -b 3-4
β
따라서 UTF-8에 대한 -c
것 이상은 아닙니다 -b
.
로케일 설정이 UTF-8에 적합하지는 않지만, wc
예상대로 작동합니다.
옵션 -c
( --bytes
)을 사용하여 바이트 수를 계산하는 데 자주 사용됩니다 .
(혼동 옵션 이름에 유의하십시오.)
$ printf 'αβγ' | wc -c
6
그러나 옵션 -m
( --chars
)으로 문자를 계산할 수도 있습니다 .
$ printf 'αβγ' | wc -m
3
그래서 내 구성은 괜찮은 것 같지만 뭔가 특별한 점이 cut
있습니다.
어쩌면 UTF-8을 전혀 지원하지 않습니까? 그러나 멀티 바이트 문자를 지원하는 것으로 보이지만 그렇지 않으면 -b
및 을 지원할 필요가 없습니다 -c
.
무슨 일이야? 그리고 왜?
내가 알 수있는 한 로케일 설정은 utf8을 올바르게 찾습니다.
$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
입력은 바이트 단위입니다.
$ printf 'αβγ' | hd
00000000 ce b1 ce b2 ce b3 |......|
00000006
-c
와 동일한 코드를 사용하고있는 것 같습니다-b
. 소스 코드를 보셨습니까? 어쩌면-c
실제로 의미 하는 힌트를 찾을 수 있습니다 .