In meinem letzten PHP-Projekt schreibe ich Programme auf Japanisch. Nicht nur Klassennamen und Variablennamen, sondern auch Dateinamen sind auf Japanisch. (Ich möchte in einem separaten Artikel zusammenfassen, warum ich mich entschieden habe, auf Japanisch zu schreiben, und die Motivation dafür.)
In diesem Projekt ist die Entwicklungsumgebung Mac und die Produktionsumgebung Linux, es sind jedoch Probleme wie PHP aufgetreten, bei denen japanische Dateinamen nicht automatisch geladen wurden. Als ich es nachgeschlagen habe, war es, weil der Unicode-Standard zwischen dem Mac-Dateisystem und dem Linux-Dateisystem unterschiedlich war. Weitere Informationen finden Sie unter "Einführung Mania Dorafuto Edition: Hinweise zu Dateinamen unter Mac OS X (NFC, NFD usw.) ”Artikel wird hilfreich sein.
Um den Unterschied zwischen Dateisystemen kurz zu erklären,
Mac: Ein Standard namens NFD. Die Trübung und die Halbtrübung werden getrennt (normalisiert). "Da" wird zu 6 Bytes von "ta" und "" Linux: Ein Standard namens NFC. Trübung und Halbtrübung (Denormalisierung) nicht zerstreuen. "Da" wird zu 3 Bytes
Da ist ein Unterschied.
Wenn Sie die auf dem Mac erstellte NFD-Datei auf Git übertragen, wird sie im normalisierten Zustand wie sie ist bereitgestellt. Es wäre schön, wenn Sie es von NFD in NFC konvertieren könnten, wenn Sie es unter Linux ziehen, aber die Datei wird als NFD erstellt. Da der Quellcode von PHP NFC ist, tritt das Phänomen auf, dass "es auf einem Mac funktioniert hat, aber unter Linux nicht mehr funktioniert", wenn auf den Dateinamen fest verwiesen wird.
Es ist unvermeidlich, dass die japanische Datei festgeschrieben wurde. Um die problematische Datei vorerst zu identifizieren, habe ich in Python ein Skript erstellt, um die NFD-Datei herauszufinden.
$ 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()
Es ist eine Datei, die auf einem Mac ↓ erstellt wurde
$ 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"
}
Es ist völlig ununterscheidbar, ob es sich um NFD oder NFC handelt, aber Sie können sehen, dass die Anzahl der Zeichenfolgenbytes zwischen "Hahifuheho" und "Papipupepo" unterschiedlich ist. Sie können sehen, dass Umlaut auf Deutsch und Koreanisch auf Koreanisch ebenfalls NFD sind.
Suchen Sie nach der NFD-Datei in diesem:
$ find-nfd.py /tmp/test/1
/tmp/test/1/schön
/tmp/test/1/한글
/tmp/test/1/Papipupepo
3 files found
Ich habe drei gefunden.
Wenn Sie eine solche Datei finden, müssen Sie sie in einer Linux- oder Windows-Umgebung umbenennen und wieder in git einfügen.
Sie könnten gefragt werden: "Tun Sie dieses nervige Ding jedes Mal?", Aber wir ändern den Entwicklungsmechanismus selbst, so dass Vagrant in nur 5 Minuten eine Debian-Umgebung erstellen kann :)
Obwohl es sich um einen Mac handelt, handelt es sich nicht um eine Produktionsumgebung. Daher ist es wichtig, eine Entwicklungsumgebung zu erstellen, die genau der Produktionsumgebung entspricht, um unnötige Harmonie zu vermeiden.
Recommended Posts