sort
sort
coreutils 8.26 (Homebrew에서 설치)에서 GNU를 실행하는 OSX 시스템과 sort
coreutils 8.25에서 GNU를 실행하는 Linux 시스템이 있습니다 .sort
맥의 경우:
mac$ echo -e "{1\n2" | sort
2
{1
Linux의 경우:
linux$ echo -e "{1\n2" | sort
{1
2
나는 그것이 sort
지역에 따라 다르다는 것을 안다. locale
Linux 시스템에서 실행하고 출력의 각 행을 앞에 추가하고 OSX export
시스템에서 결과 행을 실행한 다음 (동일한 터미널에서) sort 명령을 다시 실행하여 이전과 동일한 출력을 제공했습니다.
locale
그러나 Mac에서 실행하면 Linux에 나타나는 모든 줄이 표시되지 않는다는 것을 알았습니다 . 이것이 관련이 있는지 확실하지 않습니다.
Linux의 로케일:
linux$ locale
LANG=en_CA.UTF-8
LANGUAGE=en_CA:en
LC_CTYPE="en_CA.UTF-8"
LC_NUMERIC="en_CA.UTF-8"
LC_TIME="en_CA.UTF-8"
LC_COLLATE="en_CA.UTF-8"
LC_MONETARY="en_CA.UTF-8"
LC_MESSAGES="en_CA.UTF-8"
LC_PAPER="en_CA.UTF-8"
LC_NAME="en_CA.UTF-8"
LC_ADDRESS="en_CA.UTF-8"
LC_TELEPHONE="en_CA.UTF-8"
LC_MEASUREMENT="en_CA.UTF-8"
LC_IDENTIFICATION="en_CA.UTF-8"
LC_ALL=en_CA.UTF-8
OSX의 로케일:
mac$ locale
LANG="en_CA.UTF-8"
LC_COLLATE="en_CA.UTF-8"
LC_CTYPE="en_CA.UTF-8"
LC_MESSAGES="en_CA.UTF-8"
LC_MONETARY="en_CA.UTF-8"
LC_NUMERIC="en_CA.UTF-8"
LC_TIME="en_CA.UTF-8"
LC_ALL="en_CA.UTF-8"
LC_ALL=C
두 컴퓨터 모두에 설정하면 둘 다 2
이전에 정렬된다는 것을 알았습니다 {1
. 하지만 LC_ALL=en_CA.UTF-8
두 대의 컴퓨터에 설정하면 위와 같이 다른 결과가 나타납니다. LC_ALL=en_CA.utf8
두 대의 컴퓨터에 설정한 경우에도 마찬가지입니다. (Linux 시스템에는 나열되지만 locale -a
OSX 시스템에는 나열되지 않습니다.)en_CA.utf8
en_CA.UTF-8
무슨 일인지 아세요?
답변1
지난번에 같은 문제에 대해 좀 더 조사한 적이 있어서 기술적인 답변을 공유하겠습니다.
macOS에서 /usr/share/locale/en_US.UTF-8/LC_COLLATE
(또는 en_CA.UTF-8
동일한 것)은 /usr/share/locale/la_LN.US-ASCII/LC_COLLATE
다음에서 파생된 심볼릭 링크입니다.la_LN.US-ASCII.src
그리고 colldef
. 다음은 전문이다 la_LN.US-ASCII.src
:
# ASCII
#
# $FreeBSD: src/share/colldef/la_LN.US-ASCII.src,v 1.2 1999/08/28 00:59:47 peter Exp $
#
order \
\x00;...;\xff
LC_COLLATE
체크섬을 확인하여 바이너리가 실제로 생성되었는지 확인할 수 있습니다 la_LN.US-ASCII.src
.
$ colldef -o /dev/stdout usr-share-locale.tproj/colldef/la_LN.US-ASCII.src | sha256sum
9ec9b40c837860a43eb3435d7a9cc8235e66a1a72463d11e7f750500cabb5b78 -
$ sha256sum </usr/share/locale/en_US.UTF-8/LC_COLLATE
9ec9b40c837860a43eb3435d7a9cc8235e66a1a72463d11e7f750500cabb5b78 -
규칙 세트는 이해하기 쉽습니다. 바이트 값을 하나씩 비교하면 됩니다. 따라서 조합은 en_US.UTF-8
POSIX 로캘(C 로캘이라고도 함)과 동일합니다. {
0x7B이고, 2
0x32이므로 {
맨 뒤에 있습니다 2
.
이 규칙 세트는 FreeBSD 5의 제품이며 Mac OS X 10.3 Panther와 동기화되었습니다. 바라보다colldef
FreeBSD 5.0.0 소스 트리의 디렉터리. 그 이후로 OS X/macOS에서는 변경되지 않았습니다.
Linux에서 로케일 프로그램과 데이터는 glibc
glibc를 참조하세요.localedata/locales
나무또는 /usr/share/i18n/locales
Debian/Ubuntu에서. 를 확인하면 규칙을 따르는 /usr/share/i18n/locales/en_US
것을 볼 수 있습니다 . 그래서 다음과 같이iso14651_t1_common
LC_COLLATE
ISO 14651규칙을 정리하세요.
자세한 내용은 블로그 게시물:https://blog.zhimingwang.org/macos-lc_collate-hunt.