Gnu 정렬이 내 OSX 시스템과 Linux 시스템에서 다르게 정렬되는 이유는 무엇입니까?

Gnu 정렬이 내 OSX 시스템과 Linux 시스템에서 다르게 정렬되는 이유는 무엇입니까?

sortsortcoreutils 8.26 (Homebrew에서 설치)에서 GNU를 실행하는 OSX 시스템과 sortcoreutils 8.25에서 GNU를 실행하는 Linux 시스템이 있습니다 .sort

맥의 경우:

mac$ echo -e "{1\n2" | sort
2
{1

Linux의 경우:

linux$ echo -e "{1\n2" | sort
{1
2

나는 그것이 sort지역에 따라 다르다는 것을 안다. localeLinux 시스템에서 실행하고 출력의 각 행을 앞에 추가하고 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 -aOSX 시스템에는 나열되지 않습니다.)en_CA.utf8en_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-8POSIX 로캘(C 로캘이라고도 함)과 동일합니다. {0x7B이고, 20x32이므로 {맨 뒤에 있습니다 2.

이 규칙 세트는 FreeBSD 5의 제품이며 Mac OS X 10.3 Panther와 동기화되었습니다. 바라보다colldefFreeBSD 5.0.0 소스 트리의 디렉터리. 그 이후로 OS X/macOS에서는 변경되지 않았습니다.


Linux에서 로케일 프로그램과 데이터는 glibcglibc를 참조하세요.localedata/locales나무또는 /usr/share/i18n/localesDebian/Ubuntu에서. 를 확인하면 규칙을 따르는 /usr/share/i18n/locales/en_US것을 볼 수 있습니다 . 그래서 다음과 같이iso14651_t1_commonLC_COLLATEISO 14651규칙을 정리하세요.


자세한 내용은 블로그 게시물:https://blog.zhimingwang.org/macos-lc_collate-hunt.

관련 정보