[JAVA] Le monde malheureux des caractères génériques insensibles à la casse (macOS)

À propos de cet article

Le système de fichiers macOS est insensible à la casse dans la plupart des répertoires par défaut. Dans un tel monde, qu'est-ce qui correspondrait à un joker?

Être insensible à la casse

Par exemple, si vous exécutez ce script

bash



#!/bin/bash

set -eu

#Caractères alphanumériques ASCII
touch foo.txt FOO.txt
ls *.txt && rm *.txt

#Caractères dits pleine largeur
touch zen.txt ZEN.txt
ls *.txt && rm *.txt

#Lettres grecques, lettres Kirill, chiffres romains
touch ωяⅶ.txt ΩЯⅦ.txt
ls *.txt && rm *.txt

# DZ, NJ
touch dz.txt # U+01F3	Latin Small Letter DZ
touch Dz.txt # U+01F2	Latin Capital Letter D with Small Letter z
touch DZ.txt # U+01F1	Latin Capital Letter DZ
touch nj.txt # U+01CC	Latin Small Letter NJ
touch Nj.txt # U+01CB	Latin Capital Letter N with Small Letter J
touch NJ.txt # U+01CA	Latin Capital Letter NJ
ls *.txt && rm *.txt

# i witout dot, etc.
touch ı.txt # U+0131 Small I without dot
touch İ.txt # U+0130 Capital I with dot
touch i.txt # U+0069 Small I
touch I.txt # U+0049 Capital I
ls *.txt && rm *.txt

#Caractère fermé
touch ⓐ.txt # U+24D0
touch Ⓐ.txt # U+24B6
ls *.txt && rm *.txt

C'est le résultat

foo.txt
zen.txt
ωяⅶ.txt
nj.txt	dz.txt
i.txt	İ.txt	ı.txt
ⓐ.txt

«FOO» et «foo» sont faciles. Puisqu'il n'est pas sensible à la casse, un seul peut survivre.

Comme vous pouvez le voir autour de zen, ωяⅶ et , les caractères en dehors de la plage ASCII 7 bits ont également des majuscules et des minuscules, et ils sont indiscernables.

«Dz» est un caractère de la catégorie «Lettre de la casse du titre» et n'est ni supérieur ni inférieur. La minuscule correspondante est «dz» et la majuscule correspondante est «DZ». Ce caractère est également insensible à la casse, donc même si vous écrivez touch dz.txt Dz.txt DZ.txt, un seul peut survivre.

Le tableau ci-dessous montre les cas de «ı», «İ», «i», «I».

Langue IMinuscule iCapitale
Anglais i I
la langue turque ı İ

Si vous touchez ı.txt, İ.txt, ʻi.txt, ʻI.txt, ʻI.txt, İ.txt, ı.txt` survivent.

En regardant unicode.org, «ı» minuscule sans points devient un «I» normal lorsqu'il est mis en majuscule. Néanmoins, sur APFS, «ı.txt» et «I.txt» sont considérés comme des noms différents.

Correspondance dans divers environnements

J'ai essayé de voir ce qui se passe dans certains environnements.

script shell (bash) etc.

Le résultat est dans l'environnement suivant:

C'est la même chose que POSIX glob et bash, donc cela semble être basique, mais c'est plutôt désagréable.

Fondamentalement,

Il est devenu. Il était assez surprenant que «Foo.txt» corresponde à 1 et «F * .txt» correspond à 0.

Autant que j'ai remarqué, j'ai le même avis que le système de fichiers où il n'y a pas de jokers.

F*/f*/Foo

wildcard foo.txt fred.txt
F*.txt
f*.txt
Foo.txt

i / I / ı / İ

wildcard i-lat-lo.txt I-lat-up.txt ı-tur-lo.txt İ-tur-up.txt
i*.txt
I*.txt
ı*.txt
İ*.txt
İ-tur-lo.txt
I-tur-lo.txt
ı-lat-up.txt

DZ / Dz / dz

wildcard DZ-uu.txt Dz-ul.txt dz-ll.txt
DZ*.txt
Dz*.txt
dz*.txt
dz-uu.txt
dz-ul.txt
Dz-uu.txt

ruby(Dir.glob)

Le comportement de ruby est assez différent de POSIX glob.

Fondamentalement, cela semble cohérent avec le fonctionnement de "insensible à la casse". Avec Foo.txt, seulement foo.txt correspond, et avec F * .txt, foo.txt et fred.txt correspondent. Facile à comprendre.

Mais,

ruby


Dir.glob("dz-u*.txt") #=> []
Dir.glob("dz-uu.txt") #=> ["files/DZ-uu.txt"]

Il existe également un schéma selon lequel le nombre de correspondances diminue lorsqu'un caractère générique est inséré. punaise?

F*/f*/Foo

wildcard foo.txt fred.txt
F*.txt
f*.txt
Foo.txt

i / I / ı / İ

wildcard i-lat-lo.txt I-lat-up.txt ı-tur-lo.txt İ-tur-up.txt
i*.txt
I*.txt
ı*.txt
İ*.txt
İ-tur-lo.txt
I-tur-lo.txt
ı-lat-up.txt

DZ / Dz / dz

wildcard DZ-uu.txt Dz-ul.txt dz-ll.txt
DZ*.txt
Dz*.txt
dz*.txt
dz-uu.txt
dz-ul.txt
Dz-uu.txt

Java(PathMatcher)

Il y a une interface appelée PathMatcher dans java.nio.file, donc j'ai essayé de l'utiliser. Ceci est également assez différent de POSIX glob. Cela semble toujours être sensible à la casse. Il se comporte différemment du nom de fichier dans le système de fichiers, mais est cohérent.

F*/f*/Foo

wildcard foo.txt fred.txt
F*.txt
f*.txt
Foo.txt

i / I / ı / İ

wildcard i-lat-lo.txt I-lat-up.txt ı-tur-lo.txt İ-tur-up.txt
i*.txt
I*.txt
ı*.txt
İ*.txt
İ-tur-lo.txt
I-tur-lo.txt
ı-lat-up.txt

DZ / Dz / dz

wildcard DZ-uu.txt Dz-ul.txt dz-ll.txt
DZ*.txt
Dz*.txt
dz*.txt
dz-uu.txt
dz-ul.txt
Dz-uu.txt

C#(.NET Core / Directory.GetFiles)

Similaire au mouvement de ruby. Contrairement à ruby, «DZ * .txt» correspond correctement à «dz-ll.txt» (?). Cependant, au contraire, «DZ-uu.txt» ne peut pas être obtenu avec «dz-uu.txt».

F*/f*/Foo

wildcard foo.txt fred.txt
F*.txt
f*.txt
Foo.txt

i / I / ı / İ

wildcard i-lat-lo.txt I-lat-up.txt ı-tur-lo.txt İ-tur-up.txt
i*.txt
I*.txt
ı*.txt
İ*.txt
İ-tur-lo.txt
I-tur-lo.txt
ı-lat-up.txt

DZ / Dz / dz

wildcard DZ-uu.txt Dz-ul.txt dz-ll.txt
DZ*.txt
Dz*.txt
dz*.txt
dz-uu.txt
dz-ul.txt
Dz-uu.txt

C#(Mono / Directory.GetFiles)

Étonnamment, le comportement est différent entre .NET Core et Mono. J'ai l'impression de perdre face au caractère «Dz», qui n'est ni supérieur ni inférieur.

F*/f*/Foo

wildcard foo.txt fred.txt
F*.txt
f*.txt
Foo.txt

i / I / ı / İ

wildcard i-lat-lo.txt I-lat-up.txt ı-tur-lo.txt İ-tur-up.txt
i*.txt
I*.txt
ı*.txt
İ*.txt
İ-tur-lo.txt
I-tur-lo.txt
ı-lat-up.txt

DZ / Dz / dz

wildcard DZ-uu.txt Dz-ul.txt dz-ll.txt
DZ*.txt
Dz*.txt
dz*.txt
dz-uu.txt
dz-ul.txt
Dz-uu.txt

Perl(glob)

Il se comporte un peu comme POSIX glob, mais traite différemment les minuscules sans point i.

F*/f*/Foo

wildcard foo.txt fred.txt
F*.txt
f*.txt
Foo.txt

i / I / ı / İ

wildcard i-lat-lo.txt I-lat-up.txt ı-tur-lo.txt İ-tur-up.txt
i*.txt
I*.txt
ı*.txt
İ*.txt
İ-tur-lo.txt
I-tur-lo.txt
ı-lat-up.txt

DZ / Dz / dz

wildcard DZ-uu.txt Dz-ul.txt dz-ll.txt
DZ*.txt
Dz*.txt
dz*.txt
dz-uu.txt
dz-ul.txt
Dz-uu.txt

Résumé

POSIX glob a le même avis que le système de fichiers sur la partie sans caractères génériques, mais il est difficile de comprendre qu'elle devienne sensible à la casse lorsque des caractères génériques sont inclus.

A le même avis que POSIX glob.

d'autre part

Semble traiter avec son propre algorithme et renvoie des résultats différents de POSIX glob. Cela a tendance à être dérangeant autour "d'un ensemble de deux lettres de l'alphabet qui ne peuvent être majuscules que pour la première lettre" et "un i inférieur avec des points supprimés".

Recommended Posts

Le monde malheureux des caractères génériques insensibles à la casse (macOS)
Le monde des livres d'ingénierie de contrôle
L'histoire d'essayer Sourcetrail × macOS × VS Code
Étude depuis le début de Python Hour1: Hello World
Le début de cif2cell
Le sens de soi
le zen de Python
L'histoire de sys.path.append ()
La vengeance des types: la vengeance des types
Je veux connaître la légende du monde des technologies informatiques