현재 로케일이 UTF-8 인코딩을 사용하는지 확인하는 방법은 무엇입니까?

현재 로케일이 UTF-8 인코딩을 사용하는지 확인하는 방법은 무엇입니까?

사용자의 로캘이 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설정 하고 대시를 선택 사항으로 만들 수 있습니다.bashnocasematch

shopt -s nocasematch
[[ $LANG =~ UTF-?8$ ]] && echo "Uses UTF-8 encoding.."

관련 정보