로케일의 문자 인코딩 (로 알 수 있음 locale charmap)은 문자 당 멀티 바이트입니다.
오늘날 가장 일반적인 것은 문자가 1-4 바이트 이상 인코딩 될 수있는 UTF-8입니다. 모든 바이트 시퀀스가 UTF-8에서 유효한 문자를 형성하는 것은 아닙니다. UTF-8의 모든 비 ASCII 문자는 2 개의 가장 높은 비트 세트가있는 1 바이트로 시작하여 가장 높은 (그러나 2 번째가 아닌) 비트 세트가 따르는 바이트 수를 알려줍니다.
/dev/urandom임의의 바이트 스트림을 포함합니다. tr문자를 음역하므로 해당 바이트를 문자로 디코딩해야합니다. 범위의 ASCII 문자는 모두 UTF-8로 한 문자로 인코딩되지만 tr여전히 모든 문자를 디코딩해야합니다. 예를 들어 A0x41 바이트 이외의 일부 문자 (에 대한 코드)를 포함하는 다른 멀티 바이트 인코딩이 있습니다 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...