AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 762342
Accepted
nneonneo
nneonneo
Asked: 2023-11-25 19:05:21 +0800 CST2023-11-25 19:05:21 +0800 CST 2023-11-25 19:05:21 +0800 CST

Por que ls está classificando os nomes de arquivos chineses por comprimento?

  • 772

Encontrei um comportamento um pouco estranho que não entendo completamente com lsnomes de arquivos chineses. Estou executando o macOS 13.6.1 com SIP habilitado (sem modificações principais do sistema operacional), MacPorts instalados e inglês dos EUA como idioma principal.

Primeiro, execute este pequeno script em uma pasta em branco para fazer alguns arquivos de teste:

import random

random.seed(42)

for i in range(30):
    n = random.randrange(3, 8)
    fn = "".join(random.choice("一二三") for _ in range(n))
    open(fn, "w")

Isso perfaz 30 arquivos nomeados com combinações aleatórias dos caracteres 一二三 (um, dois, três).

Em seguida, executo ls -lno meu Mac (versão "macOS 13.5" de acordo com a página de manual):

% ls -l
total 8
-rw-r--r--@ 1 brx  staff  164 Nov 25 02:41 test.py
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 一一三
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 一三二
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 三三一
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 二一二
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 一一三一
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 一三二一
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 三三一三
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 三三三三
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 三二三一
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 三二二三
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 二一一一
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 二一三三
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 一三二三三
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 三一三一一
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 三二一三二
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 一三三二三一
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 一二一一三三
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 一二三二一一
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 二一一三三二
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 二三二三二三
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 二二一一二一
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 二二三二一二
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 一三二一一一一
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 一三二一一一二
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 一三二三三三一
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 一二一三二三三
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 三一一二二二三
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 二三三二三二二
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 二三二一二二一

Os arquivos são claramente classificados por comprimento do nome do arquivo , mas de outra forma não são classificados em comprimentos idênticos, como se lsestivessem tratando todos os caracteres chineses como sendo exatamente equivalentes.

LANGestá definido como en_US.UTF-8(e nenhuma LC_*variável está definida), então talvez isso seja apenas um problema com a classificação em inglês?

% LANG=zh_CN.utf-8 ls -l
total 8
-rw-r--r--@ 1 brx  staff  164 11 25 02:41 test.py
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 一一三
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 一三二
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 三三一
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 二一二
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 一一三一
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 一三二一
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 三三一三
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 三三三三
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 三二三一
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 三二二三
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 二一一一
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 二一三三
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 一三二三三
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 三一三一一
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 三二一三二
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 一三三二三一
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 一二一一三三
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 一二三二一一
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 二一一三三二
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 二三二三二三
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 二二一一二一
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 二二三二一二
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 一三二一一一一
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 一三二一一一二
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 一三二三三三一
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 一二一三二三三
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 三一一二二二三
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 二三三二三二二
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 二三二一二二一

Certo, talvez seja apenas o Mac integrado lssendo uma porcaria; vamos tentar GNU Coreutils (de MacPorts, ls (GNU coreutils) 9.4):

% gls -l
total 4
-rw-r--r--+ 1 brx staff 164 Nov 25 02:41 test.py
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一一三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一三二
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三三一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二一二
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一一三一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一三二一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三三一三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三三三三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三二三一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三二二三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二一一一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二一三三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一三二三三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三一三一一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三二一三二
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一三三二三一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一二一一三三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一二三二一一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二一一三三二
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二三二三二三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二二一一二一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二二三二一二
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一三二一一一一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一三二一一一二
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一三二三三三一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一二一三二三三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三一一二二二三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二三三二三二二
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二三二一二二一
% LANG=zh_CN.utf-8 gls -l
总计 4
-rw-r--r--+ 1 brx staff 164 1125日 02:41 test.py
-rw-r--r--+ 1 brx staff   0 1125日 02:41 一一三
-rw-r--r--+ 1 brx staff   0 1125日 02:41 一三二
-rw-r--r--+ 1 brx staff   0 1125日 02:41 三三一
-rw-r--r--+ 1 brx staff   0 1125日 02:41 二一二
-rw-r--r--+ 1 brx staff   0 1125日 02:41 一一三一
-rw-r--r--+ 1 brx staff   0 1125日 02:41 一三二一
-rw-r--r--+ 1 brx staff   0 1125日 02:41 三三一三
-rw-r--r--+ 1 brx staff   0 1125日 02:41 三三三三
-rw-r--r--+ 1 brx staff   0 1125日 02:41 三二三一
-rw-r--r--+ 1 brx staff   0 1125日 02:41 三二二三
-rw-r--r--+ 1 brx staff   0 1125日 02:41 二一一一
-rw-r--r--+ 1 brx staff   0 1125日 02:41 二一三三
-rw-r--r--+ 1 brx staff   0 1125日 02:41 一三二三三
-rw-r--r--+ 1 brx staff   0 1125日 02:41 三一三一一
-rw-r--r--+ 1 brx staff   0 1125日 02:41 三二一三二
-rw-r--r--+ 1 brx staff   0 1125日 02:41 一三三二三一
-rw-r--r--+ 1 brx staff   0 1125日 02:41 一二一一三三
-rw-r--r--+ 1 brx staff   0 1125日 02:41 一二三二一一
-rw-r--r--+ 1 brx staff   0 1125日 02:41 二一一三三二
-rw-r--r--+ 1 brx staff   0 1125日 02:41 二三二三二三
-rw-r--r--+ 1 brx staff   0 1125日 02:41 二二一一二一
-rw-r--r--+ 1 brx staff   0 1125日 02:41 二二三二一二
-rw-r--r--+ 1 brx staff   0 1125日 02:41 一三二一一一一
-rw-r--r--+ 1 brx staff   0 1125日 02:41 一三二一一一二
-rw-r--r--+ 1 brx staff   0 1125日 02:41 一三二三三三一
-rw-r--r--+ 1 brx staff   0 1125日 02:41 一二一三二三三
-rw-r--r--+ 1 brx staff   0 1125日 02:41 三一一二二二三
-rw-r--r--+ 1 brx staff   0 1125日 02:41 二三三二三二二
-rw-r--r--+ 1 brx staff   0 1125日 02:41 二三二一二二一

Além da exibição de data humoristicamente quebrada do GNU Coreutils, nada muda. A única coisa que parece funcionar é C.utf-8:

% LANG=C.utf-8 ls -l
total 8
-rw-r--r--@ 1 brx  staff  164 Nov 25 02:41 test.py
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ?????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ??????????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ?????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ?????????????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ?????????????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ???????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ?????????????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ??????????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ?????????????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ??????????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ?????????????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ???????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ?????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ???????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ??????????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ?????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ?????????????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ?????????????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ??????????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ??????????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ??????????????????
% LANG=C.utf-8 gls -l
total 4
-rw-r--r--+ 1 brx staff 164 Nov 25 02:41 test.py
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一一三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一一三一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一三三二三一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一三二
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一三二一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一三二一一一一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一三二一一一二
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一三二三三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一三二三三三一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一二一一三三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一二一三二三三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一二三二一一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三一一二二二三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三一三一一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三三一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三三一三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三三三三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三二一三二
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三二三一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三二二三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二一一一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二一一三三二
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二一三三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二一二
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二三三二三二二
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二三二一二二一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二三二三二三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二二一一二一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二二三二一二

O que está acontecendo aqui? As localidades estão quebradas no meu Mac?

EDIT: Para esclarecer o comportamento esperado : eu esperaria lsclassificar os caracteres em qualquer ordem de classificação razoável; alguns pedidos razoáveis ​​seriam ponto de código Unicode (一, 三, 二), ordem numérica ou de contagem de traços (一, 二, 三) ou ordem Pinyin (二, 三, 一, correspondente a "er, san, yi").

Algumas informações extras para responder comentários (no en_US.UTF-8local):

  • a ordem permanece a mesma quando canalizada para sortou gsortcom ou sem -u.

  • na verdade, não há localidade C.utf-8 em meu sistema, o que explica por que obtenho a mesma saída que na localidade C, uma ordem por valor de byte e cada byte renderizado como ?.

  • expr '一二三' '<' '三一二', expr '一二三' '>' '三一二', expr '一二三' = '三一二'retorna 1, 0 e 0 respectivamente, seja com macos exprou GNU expr.

  • perl -MPOSIX -le 'print strcoll@ARGV' -- '一' '二'produz -140, seja com o perlfornecido com macos ou MacPorts.

  • perl -MPOSIX -le 'print strcoll@ARGV' -- '一一' '二'saídas19968

  • as codificações desses caracteres são semelhantes $'\344\270\200\344\270\200\344\270\211'às 一一三relatadas por glsno código do Cidioma, portanto, parece que eles estão codificados corretamente em UTF-8.

  • a saída de perl -MPOSIX -le 'print unpack "H*", strxfrm$_ for @ARGV' -- '一' '一一' '二'é:

    303034323030303030346c32
    30303432303034323030303030346c3230346c32
    303034323030303030346e3e
    
  • a saída de perl -MPOSIX -le 'print "$_\t" . unpack "H*", strxfrm$_ for <*>'é

    一一三一  303034323030343230303432303034323030303030346c3230346c3230346c3b30346c32
    一一三   3030343230303432303034323030303030346c3230346c3230346c3b
    一三三二三一    3030343230303432303034323030343230303432303034323030303030346c3230346c3b30346c3b30346e3e30346c3b30346c32
    一三二一一一一   303034323030343230303432303034323030343230303432303034323030303030346c3230346c3b30346e3e30346c3230346c3230346c3230346c32
    一三二一一一二   303034323030343230303432303034323030343230303432303034323030303030346c3230346c3b30346e3e30346c3230346c3230346c3230346e3e
    一三二一  303034323030343230303432303034323030303030346c3230346c3b30346e3e30346c32
    一三二三三三一   303034323030343230303432303034323030343230303432303034323030303030346c3230346c3b30346e3e30346c3b30346c3b30346c3b30346c32
    一三二三三 30303432303034323030343230303432303034323030303030346c3230346c3b30346e3e30346c3b30346c3b
    一三二   3030343230303432303034323030303030346c3230346c3b30346e3e
    一二一一三三    3030343230303432303034323030343230303432303034323030303030346c3230346e3e30346c3230346c3230346c3b30346c3b
    一二一三二三三   303034323030343230303432303034323030343230303432303034323030303030346c3230346e3e30346c3230346c3b30346e3e30346c3b30346c3b
    一二三二一一    3030343230303432303034323030343230303432303034323030303030346c3230346e3e30346c3b30346e3e30346c3230346c32
    三一一二二二三   303034323030343230303432303034323030343230303432303034323030303030346c3b30346c3230346c3230346e3e30346e3e30346e3e30346c3b
    三一三一一 30303432303034323030343230303432303034323030303030346c3b30346c3230346c3b30346c3230346c32
    三三一三  303034323030343230303432303034323030303030346c3b30346c3b30346c3230346c3b
    三三一   3030343230303432303034323030303030346c3b30346c3b30346c32
    三三三三  303034323030343230303432303034323030303030346c3b30346c3b30346c3b30346c3b
    三二一三二 30303432303034323030343230303432303034323030303030346c3b30346e3e30346c3230346c3b30346e3e
    三二三一  303034323030343230303432303034323030303030346c3b30346e3e30346c3b30346c32
    三二二三  303034323030343230303432303034323030303030346c3b30346e3e30346e3e30346c3b
    二一一一  303034323030343230303432303034323030303030346e3e30346c3230346c3230346c32
    二一一三三二    3030343230303432303034323030343230303432303034323030303030346e3e30346c3230346c3230346c3b30346c3b30346e3e
    二一三三  303034323030343230303432303034323030303030346e3e30346c3230346c3b30346c3b
    二一二   3030343230303432303034323030303030346e3e30346c3230346e3e
    二三三二三二二   303034323030343230303432303034323030343230303432303034323030303030346e3e30346c3b30346c3b30346e3e30346c3b30346e3e30346e3e
    二三二一二二一   303034323030343230303432303034323030343230303432303034323030303030346e3e30346c3b30346e3e30346c3230346e3e30346e3e30346c32
    二三二三二三    3030343230303432303034323030343230303432303034323030303030346e3e30346c3b30346e3e30346c3b30346e3e30346c3b
    二二一一二一    3030343230303432303034323030343230303432303034323030303030346e3e30346e3e30346c3230346c3230346e3e30346c32
    二二三二一二    3030343230303432303034323030343230303432303034323030303030346e3e30346e3e30346c3b30346e3e30346c3230346e3e
    test.py   303033563030333830303355303033563030314d303033523030335f30303030303033563030333830303355303033563030314d303033523030335f
    
ls
  • 2 2 respostas
  • 111 Views

2 respostas

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2023-11-26T07:55:30+08:002023-11-26T07:55:30+08:00

    Você notará que entre as strings de mesmo comprimento, parece haver uma ordem relativa desses caracteres, portanto eles não são totalmente tratados como equivalentes. Não é como o 🧚🧛🧜 que não tem ordem definida nas localidades GNU libc e onde você obtém ordem aleatória na maioria das localidades UTF-8, como o seu en_US.UTF-8:

    $ ls -1
    🧚🧜🧛
    🧜🧛🧚
    🧚🧚🧚
    🧜🧚🧜
    🧛🧚🧛
    🧛🧚🧜
    🧚🧜🧚
    🧚🧚🧜
    🧜🧜🧚
    🧚🧚🧜🧚
    🧜🧜🧚🧚
    🧜🧛🧛🧜
    🧜🧛🧜🧚
    🧛🧚🧜🧜
    🧜🧛🧚🧜🧛
    🧜🧜🧛🧜🧚
    🧚🧚🧚🧛🧛
    🧜🧜🧜🧚🧜
    🧚🧚🧜🧜🧛
    🧜🧜🧛🧜🧛
    🧚🧚🧜🧛🧚
    🧜🧛🧚🧛🧛
    🧜🧚🧜🧚🧜
    🧚🧛🧜🧛🧚🧚
    🧛🧛🧚🧚🧛🧚
    🧜🧛🧚🧛🧛🧚
    🧛🧛🧜🧜🧜🧚
    🧚🧛🧚🧚🧜🧜
    🧛🧜🧛🧜🧛🧜
    test.py
    $ ls -1 | sort -u
    🧚🧜🧛
    🧚🧚🧜🧚
    🧜🧛🧚🧜🧛
    🧚🧛🧜🧛🧚🧚
    test.py
    

    O que você obtém é o mesmo tipo de ordem de classificação obtida ao classificar strings feitas de caracteres que têm o mesmo peso de agrupamento primário , mas pesos subsequentes diferentes.

    Por exemplo, na maioria das localidades, e, E, Ée étêm os mesmos pesos primários por um bom motivo. É assim que Stéphaneor STÉPHANEpode classificar antes, Stephenmesmo que Stephaneclassifique antes, Stéphanepor exemplo.

    EeE
    eeé
    eéE
    éée
    Eeee
    eeée
    Eeéé
    eéEe
    éEEé
    éEée
    ééeé
    éééé
    eéEéé
    éEeéE
    éeéee
    EEeeEe
    eEeeéé
    EeeééE
    eEéEee
    EEéEeE
    EéEéEé
    eééEée
    eEeéEéé
    eéEeeee
    eéEeeeE
    EéEeEEe
    eéEééée
    EééEéEE
    éeeEEEé
    

    (observe que todos ee têm o mesmo peso primário e também têm o mesmo peso secundário E)éeE

    Pelo resultado de strxfrm(), que parece ser na verdade um texto ASCII que podemos decodificar para:

    一一三          004200420042000004l204l204l;
    一三二          004200420042000004l204l;04n>
    三三一          004200420042000004l;04l;04l2
    二一二          004200420042000004n>04l204n>
    一一三一        0042004200420042000004l204l204l;04l2
    一三二一        0042004200420042000004l204l;04n>04l2
    三三一三        0042004200420042000004l;04l;04l204l;
    三三三三        0042004200420042000004l;04l;04l;04l;
    三二三一        0042004200420042000004l;04n>04l;04l2
    三二二三        0042004200420042000004l;04n>04n>04l;
    二一一一        0042004200420042000004n>04l204l204l2
    二一三三        0042004200420042000004n>04l204l;04l;
    一三二三三      00420042004200420042000004l204l;04n>04l;04l;
    三一三一一      00420042004200420042000004l;04l204l;04l204l2
    三二一三二      00420042004200420042000004l;04n>04l204l;04n>
    一三三二三一    004200420042004200420042000004l204l;04l;04n>04l;04l2
    一二一一三三    004200420042004200420042000004l204n>04l204l204l;04l;
    一二三二一一    004200420042004200420042000004l204n>04l;04n>04l204l2
    二一一三三二    004200420042004200420042000004n>04l204l204l;04l;04n>
    二三二三二三    004200420042004200420042000004n>04l;04n>04l;04n>04l;
    二二一一二一    004200420042004200420042000004n>04n>04l204l204n>04l2
    二二三二一二    004200420042004200420042000004n>04n>04l;04n>04l204n>
    一三二一一一一  0042004200420042004200420042000004l204l;04n>04l204l204l204l2
    一三二一一一二  0042004200420042004200420042000004l204l;04n>04l204l204l204n>
    一三二三三三一  0042004200420042004200420042000004l204l;04n>04l;04l;04l;04l2
    一二一三二三三  0042004200420042004200420042000004l204n>04l204l;04n>04l;04l;
    三一一二二二三  0042004200420042004200420042000004l;04l204l204n>04n>04n>04l;
    二三三二三二二  0042004200420042004200420042000004n>04l;04l;04n>04l;04n>04n>
    二三二一二二一  0042004200420042004200420042000004n>04l;04n>04l204n>04n>04l2
    

    você pode ver que 0042provavelmente é a representação do peso primário desses caracteres 一二三 e é o mesmo para todos os 3. Então, provavelmente há um separador 0000 e, pelo que parece, apenas um peso adicional (secundário) que é 04n>, 04l;e 04l2para二 (U+4E8C), 三 (U+4E09) e 一 (U+4E00) respectivamente¹.

    Por que a ordem de agrupamento é definida assim, eu não sei. Não é o caso em sistemas GNU onde, na maioria das localidades, os pesos primários de U+4E00 a U+9FA5 são diferentes e estão na sequência de seu ponto de código Unicode. Nem é o caso do FreeBSD 12.4-RELEASE-p5, pelo menos.

    Também é possível (e até provável) que o que estamos vendo acima seja que esses caracteres tenham um peso primário indefinido e o que 0042estamos vendo seja o peso secundário. O que explicaria por que parecemos ver apenas dois pesos por caractere no strxfrm()resultado.

    That means that in the first pass of comparing strings that happen to contain those characters, those characters are just ignored for the purpose of comparison. That's normally the case for blank or punctuation characters where you don't want them to have a strong influence on the order. For instance foo-bar would sort between fooargh and football and the secondary and further weights of - would only be used to determine the relative order of foo-bar and foo+bar for instance.

    Apple might have decided that since not everybody agrees on the order of those characters, we might as well ignore them.


    ¹ Interessante notar (embora não esclareça esse problema) é que 19968 é 0x4E00, sugerindo que o último peso é baseado no ponto de código. 04l2, 04l;, 04n>e mesmo 0042nas strings strxfrm parecem ser números em algum tipo de base 64 com 0123...lmno como os dígitos correspondentes a esses pesos compensados ​​por 258 (42 nessa base).

    • 5
  2. nneonneo
    2023-11-28T05:23:04+08:002023-11-28T05:23:04+08:00

    Descobri onde o macOS armazena arquivos de localidade, em /usr/share/locale, e para minha surpresa é assim que a zh_CN.UTF-8localidade é definida:

    % ls -la /usr/share/locale/zh_CN.UTF-8
    total 8
    drwxr-xr-x    8 root  wheel   256 Oct 12 04:10 .
    drwxr-xr-x  209 root  wheel  6688 Oct 12 04:10 ..
    lrwxr-xr-x    1 root  wheel    28 Oct 12 04:10 LC_COLLATE -> ../la_LN.US-ASCII/LC_COLLATE
    lrwxr-xr-x    1 root  wheel    17 Oct 12 04:10 LC_CTYPE -> ../UTF-8/LC_CTYPE
    drwxr-xr-x    3 root  wheel    96 Oct 12 04:10 LC_MESSAGES
    -r--r--r--    2 root  wheel    36 Oct 12 04:10 LC_MONETARY
    lrwxr-xr-x    1 root  wheel    25 Oct 12 04:10 LC_NUMERIC -> ../zh_CN.eucCN/LC_NUMERIC
    -r--r--r--    2 root  wheel   408 Oct 12 04:10 LC_TIME
    

    LC_COLLATEestá vinculado simbolicamente a /usr/share/locale/la_LN.US-ASCII/LC_COLLATE. Este arquivo tem pouco mais de 2 KB e, embora seja um arquivo binário (em vez do formato textual usado por alguns outros sistemas), ele define claramente o agrupamento para apenas 256 bytes:

    % xxd /usr/share/locale/la_LN.US-ASCII/LC_COLLATE
    00000000: 312e 3141 0a00 0000 0000 0101 0102 0000  1.1A............
    00000010: 0102 ffff fefe 0000 0000 0000 0000 0000  ................
    00000020: 0000 0000 0000 0000 0002 0000 0002 0000  ................
    00000030: 0003 0000 0003 0000 0004 0000 0004 0000  ................
    00000040: 0005 0000 0005 0000 0006 0000 0006 0000  ................
    00000050: 0007 0000 0007 0000 0008 0000 0008 0000  ................
    00000060: 0009 0000 0009 0000 000a 0000 000a 0000  ................
    00000070: 000b 0000 000b 0000 000c 0000 000c 0000  ................
    00000080: 000d 0000 000d 0000 000e 0000 000e 0000  ................
    00000090: 000f 0000 000f 0000 0010 0000 0010 0000  ................
    ...
    00000760: 00e9 0000 00e9 0000 00ea 0000 00ea 0000  ................
    00000770: 00eb 0000 00eb 0000 00ec 0000 00ec 0000  ................
    00000780: 00ed 0000 00ed 0000 00ee 0000 00ee 0000  ................
    00000790: 00ef 0000 00ef 0000 00f0 0000 00f0 0000  ................
    000007a0: 00f1 0000 00f1 0000 00f2 0000 00f2 0000  ................
    000007b0: 00f3 0000 00f3 0000 00f4 0000 00f4 0000  ................
    000007c0: 00f5 0000 00f5 0000 00f6 0000 00f6 0000  ................
    000007d0: 00f7 0000 00f7 0000 00f8 0000 00f8 0000  ................
    000007e0: 00f9 0000 00f9 0000 00fa 0000 00fa 0000  ................
    000007f0: 00fb 0000 00fb 0000 00fc 0000 00fc 0000  ................
    00000800: 00fd 0000 00fd 0000 00fe 0000 00fe 0000  ................
    00000810: 00ff 0000 00ff 0000 0100 0000 0100 0000  ................
    00000820: 0101 0000 0101                           ......
    

    So the problem seems to be that macOS simply does not define collation ordering for any Chinese characters at all (or really anything beyond the first 256 codepoints), even in Chinese locales.

    • 1

relate perguntas

  • Verifique o espaço em disco no Ubuntu (com ls)

  • zsh: "ls -S" não está funcionando na pasta Utilitários

  • Como converter datas de arquivo para um formato específico ao usar 'ls'

  • é canalizado ls o mesmo que ls -1?

  • Como usar a saída de ls para abrir o último arquivo modificado?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve