Heim >php教程 >PHP开发 >Einige Fälle von verstümmelten chinesischen Schriftzeichen in Dateien unter Linux

Einige Fälle von verstümmelten chinesischen Schriftzeichen in Dateien unter Linux

高洛峰
高洛峰Original
2016-12-15 16:28:491604Durchsuche

Tatsächlich wird das Problem der verstümmelten Zeichen durch den im System integrierten Zeichensatz verursacht. Da der Zeichensatz der entsprechenden Zeichen nicht korrekt verwendet werden kann, kann das Betriebssystem den Text nicht erkennen, was zu verstümmelten Zeichen führt nicht schwer...

Zunächst müssen wir wissen, dass die Sprachumgebungsvariablen, die das Linux-Betriebssystem steuern, $LANG und $LC_ALL sind. Um das Problem der verstümmelten Zeichen zu lösen, müssen wir nur die oben genannten festlegen zwei Variablen korrekt.

Es gibt zwei Situationen von verstümmeltem Code:
1. Verstümmelter Code im Terminal (reine Shell-Schnittstelle)
vi /etc/profile
export LC_ALL="zh_CN.GB18030 :zh_CN.GB2312:zh_CN.GBK:zh_CN:en_US .UTF-8:en_US:en:zh:zh_TW:zh_CN.BIG5"
Speichern und beenden, das System neu starten.

2. Verstümmelt Zeichen in X-Window (grafische Oberfläche)
vi /etc/sysconfig/i18n
LANG="zh_CN.GB18030:zh_CN.GB2312:zh_CN.GBK:zh_CN:en_US.UTF-8:en_US:en:zh :zh_TW:zh_CN.BIG5"
LANGUAGE=" zh_CN.GB18030:zh_CN.GB2312:zh_CN.GBK:zh_CN:en_US.UTF-8:en_US:en:zh:zh_TW:zh_CN.BIG5"
Speichern Sie die Neustart...

Aufgrund von Chinesisch gibt es viele Zeichensatzcodes, und ich bin mir über deren Kompatibilität nicht ganz im Klaren, deshalb habe ich mein Bestes versucht, so viele verschiedene Codes wie möglich zu finden und sie aufzuschreiben Filtern Sie sie auch selbst. Die allgemeine Lösung besteht darin, die Parametervariablen der Steuerungsumgebung zu ändern und den vom Betriebssystem unterstützten Zeichensatz zu erhöhen (Voraussetzung ist, dass das Zeichen im Kernel vorhanden ist, andernfalls muss der Kernel kompiliert werden).


Das in Entwicklung befindliche WEB-System wird in RED HEAD eingesetzt.
RH-Versionsinformationen:
LSB-Version: :core-3.1-amd64:core-3.1-ia32:core-3.1-noarch:graphics-3.1-amd64:graphics-3.1-ia32:graphics-3.1-noarch
Distributor-ID: RedHatEnterpriseServer
Beschreibung: Red Hat Enterprise Linux Server Version 5 (Tikanga)
Version: 5
Codename: Tikanga
-------------- ----
Gebietsschemainformationen
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC= " zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN . UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF - 8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
--------------- -------------------
Weil es mehrere Dateien im Programmverzeichnis gibt, die ausgelesen und auf der Seite angezeigt werden müssen. Die Dateinamen sind auf Chinesisch
Ich verwende die Methode File.list(). Ich habe eine Liste mit Dateinamen erhalten, aber alle angezeigten sind verstümmelte Zeichen.
new String(filename.getBytes("utf-8"),"GBK");
new String(filename.getBytes("iso-8859-1"),"GBK"); String(filename.getBytes(),GBK");

funktioniert nicht.
Verwenden Sie System.getProperty("file.encoding"), um "utf-8" zu erhalten
Außerdem, wann Wenn Sie den Befehl ls verwenden, um ihn anzuzeigen, ist er verstümmelt. Verwenden Sie den Befehl ls --show-control-chars, um den chinesischen Namen anzuzeigen (Konsole)




Gebietsschema hinzufügen, Ich schätze, das System unterstützt den GBK-Zeichensatz nicht

Unter Ubuntu ist es vi /var/lib/locales/supported.d/local

Führen Sie nach dem Hinzufügen locale- aus. gen und aktualisieren Sie den Zeichensatz-Cache.


Wenn Sie Dateien unter Windows unter Linux betreiben müssen, kann es häufig zu Problemen bei der Dateikodierungskonvertierung kommen. Das Standarddateiformat in Windows ist GBK (gb2312). , während Linux im Allgemeinen GBK (gb2312) verwendet. So überprüfen Sie die Dateikodierung:
unter Linux auf folgende Weise:
1. Sie können die Dateikodierung direkt in Vim anzeigen
:Setzen Sie die Dateikodierung ein
um das Dateikodierungsformat anzuzeigen
Wenn Sie nur Dateien in einer anderen Kodierung anzeigen möchten Formate verwenden oder Vim zum Anzeigen von Dateien verwenden möchten, können Sie der Datei
~/.vimrc den folgenden Inhalt hinzufügen:
set binding=utf-8
fileencodings= ucs-bom,utf-8,cp936
Auf diese Weise kann vim die Dateikodierung automatisch identifizieren (es kann automatisch UTF-8- oder GBK-kodierte Dateien identifizieren). Versuchen Sie es tatsächlich anhand der von fileencodings bereitgestellten Kodierungsliste -1 (ASCII)-Kodierung.
2. enca (wenn dieser Befehl nicht in Ihrem System installiert ist, können Sie ihn mit sudo yum install -y enca installieren), um die Dateikodierung anzuzeigen
$ enca Dateiname
Dateiname: Universelles Transformationsformat 8 Bits; UTF-8
CRLF-Zeilenabschlusszeichen
Es ist zu beachten, dass Enca bestimmte GBK-codierte Dateien nicht sehr gut erkennt. Bei der Erkennung wird angezeigt:
Unerkannte Codierung
Zweitens: Dateicodierungskonvertierung
1. Konvertieren Sie die Dateikodierung direkt in Vim, z. B. Konvertieren einer Datei in das UTF-8-Format
:set fileencoding=utf-8
2. Das Befehlsformat von iconv lautet wie folgt:
iconv -f binding -t binding inputfile
Konvertieren Sie beispielsweise eine UTF-8-codierte Datei in die GBK-Codierung
iconv -f GBK -t UTF-8 file1 -o file2
3 Kodierung
Um beispielsweise eine GBK-kodierte Datei in die UTF-8-Kodierung zu konvertieren, lautet der Vorgang wie folgt
enconv -L zh_CN -x UTF-8-Dateiname
Drittens Konvertierung der Dateinamenkodierung:
Kopieren Sie die Datei von Linux nach Windows oder beim Kopieren von Dateien von Windows nach Linux scheinen chinesische Dateinamen manchmal verstümmelt zu sein. Der Grund für dieses Problem ist, dass die standardmäßige chinesische Kodierung von Dateinamen in Windows GBK ist, während die Standardkodierung für Dateinamen ist in Linux ist UTF8. Dies führt zu dem Problem verstümmelter Dateinamen. Um dieses Problem zu lösen, müssen die Dateinamen transkodiert werden.
Unter Linux wird speziell ein Tool convmv zum Konvertieren der Dateinamenkodierung bereitgestellt. Es kann den Dateinamen von GBK in UTF-8-Kodierung oder von UTF-8 in GBK konvertieren.
Überprüfen Sie zunächst, ob convmv auf Ihrem System installiert ist. Wenn nicht, verwenden Sie:
yum -y install convmv, um es zu installieren.

Werfen wir einen Blick auf die spezifische Verwendung von convmv:
convmv -f Quellkodierung -t neue Kodierung [Option] Dateiname
Allgemeine Parameter:
-r Unterordner rekursiv verarbeiten
–notest Führen Sie den Vorgang wirklich aus. Bitte beachten Sie, dass standardmäßig nicht der eigentliche Vorgang der Datei ausgeführt wird, sondern nur das Testen.
–Liste zeigt alle unterstützten Kodierungen an
–unescap Sie können einige Escapezeichen verwenden, z. B. %20 in ein Leerzeichen umwandeln

Wenn wir beispielsweise einen utf8-kodierten Dateinamen haben, konvertieren Sie ihn in GBK Kodierung, Befehl Wie folgt:
convmv -f UTF-8 -t GBK –notest utf8-kodierter Dateiname
Nach dieser Konvertierung wird der „utf8-kodierte Dateiname“ in die GBK-Kodierung konvertiert (nur die Dateinamenkodierung). Konvertierung, Dateiinhalt Es wird keine Änderung geben)


4. Vim-Kodierungseinstellung
Wie alle gängigen Texteditoren kann Vim problemlos Dateien mit verschiedenen Zeichenkodierungen bearbeiten, was natürlich auch UCS -2 einschließt , UTF-8 und andere beliebte Unicode-Kodierungsmethoden. Leider ist es, wie bei vielen anderen Programmen aus der Linux-Welt, erforderlich, dass Sie es selbst einrichten.
Vim verfügt über vier Optionen im Zusammenhang mit Zeichenkodierung, Kodierung, Dateikodierung, Dateikodierung und Terminkodierung (mögliche Werte dieser Optionen finden Sie in der Vim-Onlinehilfe: Hilfe für Kodierungsnamen). Ihre Bedeutung ist wie folgt:
* Kodierung: Die von Vim intern verwendete Zeichenkodierung, einschließlich Vims Puffer, Menütext, Nachrichtentext usw. Der Standardwert wird entsprechend Ihrem Gebietsschema ausgewählt. Im Benutzerhandbuch wird empfohlen, den Wert nur in .vimrc zu ändern. Tatsächlich scheint es sinnvoll, den Wert nur in .vimrc zu ändern. Sie können zum Bearbeiten und Speichern von Dateien eine andere Kodierung verwenden. Wenn Ihre vim-Kodierung beispielsweise utf-8 ist und die bearbeitete Datei in cp936 kodiert ist, konvertiert vim die gelesene Datei automatisch in utf-8 (vim kann lesen). und wenn Sie eine Datei schreiben, wird automatisch auf cp936 (die Dateispeicherkodierung) zurückgeschaltet.
* Dateikodierung: Die Zeichenkodierungsmethode der aktuell in Vim bearbeiteten Datei. Vim speichert die Datei auch darin Zeichenkodierung (unabhängig davon, ob die Datei neu ist oder nicht).
* Dateikodierungen: Vim erkennt beim Start automatisch die Zeichenkodierung der zu öffnenden Datei entsprechend der aufgelisteten Zeichenkodierung und stellt die Dateikodierung auf die endgültige erkannte Zeichenkodierung ein . Daher ist es am besten, die Unicode-Kodierungsmethode oben in dieser Liste und die lateinische Kodierungsmethode latin1 am Ende zu platzieren.
* termencoding: Die Zeichenkodierungsmethode des Terminals, auf dem Vim arbeitet (oder das Konsolenfenster von Windows). Wenn der Begriff, in dem sich vim befindet, mit der vim-Codierung übereinstimmt, ist keine Einstellung erforderlich. Andernfalls können Sie die Termencoding-Option von vim verwenden, um automatisch in die Termcodierung zu konvertieren. Diese Option ist für unseren häufig verwendeten GUI-Modus gVim unter Windows ungültig und für den Konsolenmodus Vim handelt es sich um die Codepage der Windows-Konsole. Es ist nicht nötig, es zu ändern.


Vims Arbeitsmethode für die Mehrzeichenkodierung
1. Starten Sie Vim und legen Sie die Zeichenkodierungsmethode für Puffer, Menütext und Nachrichtentext entsprechend dem in .vimrc festgelegten Kodierungswert fest.

2. Lesen Sie die zu bearbeitende Datei und ermitteln Sie nacheinander die Dateikodierungsmethode gemäß den in Dateikodierungen aufgeführten Zeichenkodierungsmethoden. Und stellen Sie die Dateikodierung auf die erkannte, scheinbar korrekte (Hinweis 1) Zeichenkodierung ein.

3. Vergleichen Sie die Werte von Dateikodierung und Kodierung. Wenn sie unterschiedlich sind, rufen Sie iconv auf, um den Dateiinhalt in die durch Kodierung beschriebene Zeichenkodierungsmethode zu konvertieren, und legen Sie den konvertierten Inhalt in den dafür geöffneten Puffer ab Datei. Dann können wir mit der Bearbeitung dieser Datei beginnen. Beachten Sie, dass zum Abschluss dieses Schritts die externe Datei iconv.dll aufgerufen werden muss (Hinweis 2). Sie müssen sicherstellen, dass diese Datei in $VIMRUNTIME oder anderen in der Umgebungsvariablen PATH aufgeführten Verzeichnissen vorhanden ist.

4. Vergleichen Sie beim Speichern der Datei nach der Bearbeitung die Werte von Dateikodierung und Kodierung erneut. Wenn sie unterschiedlich sind, rufen Sie iconv erneut auf, um den zu speichernden Text im Puffer in die von fileencoding beschriebene Zeichenkodierung umzuwandeln und in der angegebenen Datei zu speichern. Auch hierfür ist der Aufruf von iconv.dll erforderlich, da Unicode Zeichen in fast allen Sprachen enthalten kann und die UTF-8-Kodierung von Unicode eine sehr kostengünstige Kodierung ist (der Speicherplatzverbrauch ist geringer als bei UCS-2), wird empfohlen, den Wert von zu verwenden Kodierung Auf utf-8 eingestellt. Ein weiterer Grund dafür ist, dass Vim die Codierungsmethode der Datei automatisch genauer erkennt, wenn die Codierung auf utf-8 eingestellt ist (vielleicht ist dieser Grund der Hauptgrund). Wir bearbeiten die Dateien in chinesischem Windows, um sie zu übernehmen Kontokompatibilität mit anderer Software Es ist angemessener, die Dateikodierung auf GB2312/GBK einzustellen, daher wird empfohlen, die Dateikodierung auf Chinesisch einzustellen (Chinesisch ist ein Alias, was gb2312 in Unix und cp936 in Windows bedeutet, was die Codepage von ist). GBK).



Weitere verwandte Artikel über chinesische verstümmelte Dateien unter Linux finden Sie auf der chinesischen PHP-Website

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn