[PYTHON] "Arrêtez de soumettre des fichiers japonais à git sur Mac> <" Pour le moment, j'ai écrit un script pour rechercher des fichiers japonais incompatibles sur Mac et Linux.

Dans mon récent projet PHP, j'écris des programmes en japonais. Non seulement les noms de classe et les noms de variables, mais aussi les noms de fichiers sont en japonais. (Je voudrais résumer dans un article séparé pourquoi j'ai décidé d'écrire en japonais et la motivation pour cela.)

Dans ce projet, l'environnement de développement est Mac et l'environnement de production est Linux, mais des problèmes tels que PHP avec des noms de fichiers japonais non chargés automatiquement se sont produits. Quand j'ai cherché, c'était parce que le standard Unicode était différent entre le système de fichiers Mac et le système de fichiers Linux. Pour plus d'informations, consultez «Introduction Mania Dorafuto Edition: Remarques sur les noms de fichiers sous Mac OS X (NFC, NFD, etc.) »Cet article sera utile.

Pour expliquer brièvement la différence entre les systèmes de fichiers,

Mac: une norme appelée NFD. La turbidité et la semi-turbidité sont séparées (normalisées). "Da" devient 6 octets de "ta" et "" Linux: un standard appelé NFC. Ne pas disperser la turbidité et la semi-turbidité (dénormalisation). "Da" devient 3 octets

Il y a une différence.

Si vous validez le fichier NFD créé sur Mac vers git, il sera mis en scène dans l'état normalisé tel quel. Ce serait bien si vous pouviez le convertir de NFD en NFC lorsque vous le tirez sous Linux, mais le fichier sera créé en tant que NFD. Puisque le code source de PHP est NFC, si le nom du fichier est référencé de manière fixe, le phénomène «cela a fonctionné sur Mac, mais il a cessé de fonctionner sous Linux» se produit.

Il est inévitable que le fichier japonais ait été validé, donc afin d'identifier le fichier problématique pour le moment, j'ai fait un script en Python pour trouver le fichier NFD.

Comment utiliser

$ find-nfd -h
usage: find-nfd [-h] [path]

Find NFD files

positional arguments:
  path        path to find(Default: current working directory)

optional arguments:
  -h, --help  show this help message and exit

Code source

find-nfd.py


#!/usr/bin/env python
import os
import argparse
from unicodedata import normalize

def fild_all_files(directory):
    for root, dirs, files in os.walk(directory):
        yield root
        for file in files:
            yield os.path.join(root, file)

def to_nfc(string):
    string = string.decode("utf8")
    string = normalize("NFC", string)
    string = string.encode("utf8")
    return string

def is_nfd(string):
    if to_nfc(string) == string:
        return False
    else:
        return True

def find_nfd_files(directory):
    for file in fild_all_files(directory):
        if is_nfd(file):
            yield file

def main():
    parser = argparse.ArgumentParser(description="Find NFD files")
    parser.add_argument("path", type=str, help="path to find(Default: current working directory)", nargs='?', default=os.getcwd())
    args = parser.parse_args()

    count = 0

    for file in find_nfd_files(args.path):
        print file
        count += 1

    print ""
    print "%u files found" % (count)

if __name__ == "__main__":
    main()

Essayez d'utiliser

C'est un fichier réalisé sur Mac ↓

$ php -r 'var_dump(glob("/tmp/test/1/*"));'
array(7) {
  [0] =>
  string(13) "/tmp/test/1/a"
  [1] =>
  string(13) "/tmp/test/1/b"
  [2] =>
  string(17) "/tmp/test/1/schon"
  [3] =>
  string(19) "/tmp/test/1/schön"
  [4] =>
  string(30) "/tmp/test/1/한글"
  [5] =>
  string(27) "/tmp/test/1/Hahifuheho"
  [6] =>
  string(42) "/tmp/test/1/Papipupepo"
}

Il est totalement impossible de distinguer si c'est NFD ou NFC, mais vous pouvez voir que le nombre d'octets de chaîne est différent entre "Hahifuheho" et "Papipupepo". Vous pouvez voir que Umlaut en allemand et coréen en coréen sont également NFD.

Recherchez le fichier NFD dans ceci:

$ find-nfd.py /tmp/test/1
/tmp/test/1/schön
/tmp/test/1/한글
/tmp/test/1/Papipupepo

3 files found

J'en ai trouvé trois.

Si vous trouvez un tel fichier, vous devrez le renommer dans un environnement Linux ou Windows et le remettre dans git.

On pourrait vous demander: "Faites-vous cette chose ennuyeuse à chaque fois?", Mais nous sommes en train de changer le mécanisme de développement lui-même pour que vagrant puisse créer un environnement Debian en seulement 5 minutes :)

Bien qu'il s'agisse d'un Mac, ce n'est pas un environnement de production, il est donc important de créer un environnement de développement qui est exactement le même que l'environnement de production afin d'éviter une harmonie inutile.

Recommended Posts

"Arrêtez de soumettre des fichiers japonais à git sur Mac> <" Pour le moment, j'ai écrit un script pour rechercher des fichiers japonais incompatibles sur Mac et Linux.
Je veux déplacer le sélénium pour le moment [pour mac]
Je veux créer un Dockerfile pour le moment.
Écrivain AtCoder J'ai écrit un script qui regroupe les concours pour chaque écrivain
J'ai essayé Python sur Mac pour la première fois.
Essayez d'installer Arch Linux pour le moment.
Rechercher des fichiers volumineux sous Linux à partir de la ligne de commande
J'ai essayé d'exécuter PIFuHD sur Windows pour le moment
Je souhaite utiliser l'environnement de bureau d'Ubuntu sur Android pour le moment (version Termux)
Je souhaite utiliser l'environnement de bureau d'Ubuntu sur Android pour le moment (version UserLAnd)
Publiez le script shell créé pour réduire les problèmes de création de LiveUSB sous Linux
J'ai créé une fonction pour vérifier si le webhook est reçu dans Lambda pour le moment
Je souhaite enregistrer l'heure d'exécution et conserver un journal.
Je viens d'écrire un script pour construire Android sur une autre machine
J'ai écrit une fonction pour charger le script d'extension Git en Python
Un script python qui supprime les fichiers ._DS_Store et ._ * créés sur Mac
J'ai écrit un script pour aider goodnotes5 et Anki à travailler ensemble
[Salut Py (Partie 1)] Je veux faire quelque chose pour le moment, alors commencez par fixer un objectif.
Je souhaite utiliser l'environnement de bureau d'Ubuntu même sur Android pour le moment (entrée version japonaise de Termux dans l'environnement de bureau)
Pour le moment en utilisant FastAPI, je veux montrer comment utiliser l'API comme ça dans swagger
J'ai essayé de mesurer le temps d'attente de la file d'attente d'exécution d'un processus sous Linux
Technique pour arrêter de dessiner l'écran et réduire le temps d'attente pour la cuisson
Je veux utiliser Linux sur mac
Créez une commande pour rechercher des composés similaires dans la base de données cible avec RDKit et vérifiez le temps de traitement
Je pensais que je pouvais créer un bon éditeur gitignore, alors j'ai essayé de faire quelque chose comme MVP pour le moment
[Python] J'ai créé un script qui coupe et colle automatiquement les fichiers du PC local sur un SSD externe.
Je veux créer un lecteur de musique et enregistrer de la musique en même temps
J'ai écrit un script pour relancer la montre gulp qui mourra bientôt
Sous Linux (Ubuntu), réglez le Trackpad et réglez la fonction sur un balayage à trois doigts
Faire un histogramme pour le moment (matplotlib)
Exécutez yolov4 "pour le moment" dans Windows
J'ai écrit un script pour télécharger un plug-in WordPress
J'essaierai de résumer les liens qui me semblent utiles pour le moment
Jusqu'à ce que vous exécutiez l'application Flask sur Google App Engine pour le moment
Je souhaite créer une base de données de déjeuners [EP1] Django pour la première fois
Je souhaite créer une base de données de déjeuner [EP1-4] Django pour la première fois
[Linux] Lorsque vous souhaitez rechercher une chaîne de caractères spécifique dans plusieurs fichiers
Une histoire lorsque j'utilisais IntelliJ sous Linux et que je ne pouvais pas saisir le japonais
Un script python qui souhaite utiliser l'heure de démarrage / fin de Mac pour la gestion des présences
Spécifiez le volume sous Linux et jouez le son
Mémo de flux pour déplacer LOCUST pour le moment
Créez un code QR pour l'URL sous Linux
Simulation de dynamique moléculaire à essayer pour le moment
J'ai essayé python pour la première fois avec heroku
J'ai écrit un script d'installation automatique pour Arch Linux
À côté d'Excel, le notebook Jupyter pour le moment
Installation du moteur de jeu rétro pyxel pour Python sur Mac et lancement de l'exemple de code
Comment configurer WSL2 sur Windows 10 et créer un environnement d'étude pour les commandes Linux
Je veux absorber la différence entre l'instruction for sur la matrice Python + numpy et l'instruction Julia for
Donnez une date et une heure à la commande d'historique et collectez les fichiers d'historique de tous les utilisateurs avec un script
[Démarrage du shell] J'ai essayé d'afficher le shell sur le téléviseur avec un G-cluster à carte Linux bon marché
J'ai essayé de créer un script qui retrace les tweets d'un utilisateur spécifique sur Twitter et enregistre l'image publiée à la fois