로케일의 문자 인코딩 (로 알 수 있음 locale charmap
)은 문자 당 멀티 바이트입니다.
오늘날 가장 일반적인 것은 문자가 1-4 바이트 이상 인코딩 될 수있는 UTF-8입니다. 모든 바이트 시퀀스가 UTF-8에서 유효한 문자를 형성하는 것은 아닙니다. UTF-8의 모든 비 ASCII 문자는 2 개의 가장 높은 비트 세트가있는 1 바이트로 시작하여 가장 높은 (그러나 2 번째가 아닌) 비트 세트가 따르는 바이트 수를 알려줍니다.
/dev/urandom
임의의 바이트 스트림을 포함합니다. tr
문자를 음역하므로 해당 바이트를 문자로 디코딩해야합니다. 범위의 ASCII 문자는 모두 UTF-8로 한 문자로 인코딩되지만 tr
여전히 모든 문자를 디코딩해야합니다. 예를 들어 A
0x41 바이트 이외의 일부 문자 (에 대한 코드)를 포함하는 다른 멀티 바이트 인코딩이 있습니다 A
.
임의의 바이트 스트림이 유효하지 않은 시퀀스를 포함하도록 바인드되기 때문에 (예를 들어, ASCII가 아닌 문자는 0xc1보다 큰 바이트로 시작해야하기 때문에 0x80 바이트 자체는 UTF-8에서 유효하지 않습니다 (0xc0 및 0xc1은 UTF- 8 자)))이므로 tr
오류가 발생하면 오류와 함께 반환됩니다.
여기서 원하는 것은 문자 당 1 바이트를 갖는 인코딩에서 바이트 스트림을 문자로 간주하는 것입니다. AZ가 가정하고 ABCDEFGHIJKLMNOPQRSTUVWXYZ를 의미하고 Ý
, 와 같은 것은 아니라는 것을 의미 Ê
하므로) 범위의 모든 문자가 휴대용 문자 세트의 일부이므로 시스템에서 지원되는 모든 문자 세트에서 동일하게 인코딩되므로 선택하는 것이 중요하지 않습니다 .
이를 위해, 당신은 설정 한 것 LC_CTYPE
사용하고 무엇을 같은 것들을되는 캐릭터 세트 결정하는 하나 현지화 변수 blank
, alpha
문자 클래스가 포함되어 있습니다. 그러나 AZ 범위의 정의를 위해 LC_COLLATE
변수 (문자열 순서를 결정 하는 변수) 도 설정해야 합니다.
C
일명 POSIX
로케일은 하나의 보장 문자임을 단일 바이트이고 AZ는 ABCDEFGHIJKLMNOPQRSTUVWXYZ입니다. 당신은 할 수 있습니다 :
LC_CTYPE=C LC_COLLATE=C tr -dc 'A-Za-z0-9_!@#$%^&*()+=-'
(여기에서 -
를 끝으로 이동하면 그렇지 않은 경우 )-+
와 같은 범위로 사용됩니다 A-Z
)
그러나 노트는 것을 LC_ALL
변수는 다른 모든 무시 LC_*
와 LANG
변수를. 따라서 LC_ALL
달리 정의되어 있으면 위의 효과가 없습니다. 대신 간단하게 할 수 있습니다 :
LC_ALL=C tr -dc 'A-Za-z0-9_!@#$%^&*()+=-'
이는 오류 메시지의 언어와 같은 다른 요소에 영향을 미치지 만 LC_CTYPE 변경은 이미 오류 메시지의 문제 일 수 있습니다 (예 : C 로케일의 문자 세트로 러시아어 또는 일본어 오류 메시지를 표현할 방법이 없음).
xargs
...