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.
$ 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
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()
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.