사용자의 로캘이 UTF-8 인코딩을 사용하는지 확인하고 싶습니다.
이것은 약간 추악해 보입니다.
[[ $LANG =~ UTF-8$ ]] && echo "Uses UTF-8 encoding.."
더 일반적이고 이식 가능한 방법이 있습니까?
답변1
~에서위키피디아:
POSIX 플랫폼에서 로케일 식별자의 정의는 로케일 변형 수정자의 정의가 다르고 문자 인코딩이 식별자에 포함된다는 점을 제외하면 언어 태그의 BCP 47 정의와 유사합니다.
정의 형식은 [언어[_territory][.codeset][@modifier]]입니다. (예를 들어 UTF-8로 인코딩된 호주 영어는 en_AU.UTF-8입니다.)
그러나 예를 들어 로케일 식별자에서 코드 세트 접미사가 누락된 경우 en_AG
(참조이것질문), 코드 세트는 해당 로케일의 기본 설정(대부분 UTF-8)에 의해 정의됩니다. 따라서 LANG 환경 변수를 확인하여 현재 인코딩을 확인할 수 없습니다.
또한 이 locale
명령은 환경변수의 현재 값만 표시하기 때문에.. 따라서 코드 세트를 결정하는 데에도 명령을 사용할 수 없는 것 같습니다..
그러나 Perl 모듈이 있습니다.I18N::Langinfo
, 이것도 참조하세요질문이것이 해결책인 것 같습니다:
perl -MI18N::Langinfo=langinfo,CODESET -E 'say "Uses UTF-8 encoding .." if langinfo(CODESET()) eq "UTF-8"'
이 Perl 모듈은 C 라이브러리 함수를 둘러싼 래퍼입니다.nl_언어 정보.
답변2
LC_CTYPE 로캘 범주의 속성은 charmap
다음과 같은 목적으로 사용될 수 있습니다.
locale charmap | grep -qi 'utf-\+8' && echo "Uses UTF-8 encoding.."
로캘 이름 구문 분석이 더욱 강력해졌습니다.
(Bluehorn 제안을 기반으로 답변이 업데이트되었습니다. 감사합니다!)
답변3
POSIX 시스템에서는 다음을 사용할 수 있습니다.로케일:
$ if (locale | grep -e 'utf8' -e 'UTF-8') >/dev/null 2>&1; then echo UTF8; fi
UTF8
답변4
로캘 문자열에 소문자 하위 문자열이 포함된 경우를 처리하려면 's 옵션을 utf8
설정 하고 대시를 선택 사항으로 만들 수 있습니다.bash
nocasematch
shopt -s nocasematch
[[ $LANG =~ UTF-?8$ ]] && echo "Uses UTF-8 encoding.."