Heim > Artikel > Backend-Entwicklung > Beispiel-Tutorial zum korrekten Lesen chinesisch codierter Dateien in .NET (C#)
Wenn der Leser mit Codierung oder BOM nicht vertraut ist, wird zunächst empfohlen, zuerst diesen Artikel zu lesen: .NET (C#): Zeichencodierung (Encoding) und Byte Order Mark (BOM).
Chinesische Codierung kann grundsätzlich in zwei Kategorien unterteilt werden:
1. Ein erweiterter Satz von ANSI-Codierung: wie GBK, GB2312, GB18030 usw. Für diese Art von Codierung gibt es keine Stückliste (einige neuere chinesische Standardcodierung). (z. B. GB18030- und GBK-Kodierung, alle sind abwärtskompatibel mit der GB2312-Kodierung).
2. Unicode-Kodierungssatz: wie UTF-8, UTF-16, UTF-32 usw. Diese Art der Codierung kann eine Stückliste haben oder nicht.
3. Einige Unicode-Kodierungen weisen auch spezifische Byte-Reihenfolge-Probleme (Endianess) auf, die sogenannten Little Endian und Big Endian. Verschiedene Abschnittsreihenfolgen entsprechen unterschiedlichen BOMs, z. B. UTF8 . .
OK, nachdem wir die Grundkenntnisse verstanden haben, kehren wir zum Thema zurück, wie man chinesische Textdateien richtig öffnet. Die erste Information, die bestätigt werden muss, ist: Enthält Ihre Unicode-codierte Datei eine Stückliste?
Wenn die Stückliste enthalten ist, ist alles leicht zu sagen! Denn wenn wir die Stückliste finden, kennen wir ihre spezifische Codierung. Wenn die Stückliste nicht gefunden wird, handelt es sich nicht um Unicode. Wir können die Textdatei mit dem standardmäßigen ANSI-Kodierungssatz für Chinesisch öffnen, und sie ist in Ordnung.
Und wenn die Unicode-Kodierung keine Stückliste hat (natürlich können Sie nicht garantieren, dass alle Unicode-Dateien, die Ihnen von Benutzern gegeben werden, eine Stückliste haben), müssen Sie dann manuell anhand der Originalbytes ermitteln, ob es sich um GBK handelt? Oder UTF8? Oder eine andere Kodierung? . Dies erfordert einen speziellen Kodierungserkennungsalgorithmus (Sie können nach „Zeichensatz|Kodierungserkennung“ googlen). Natürlich ist der Kodierungserkennungsalgorithmus möglicherweise nicht 100 % genau. Genau aus diesem Grund hat Bush den Faktenfehler versteckt. Beim Surfen im Internet in Chrome werden Sie auch auf verstümmelte Zeichen stoßen. Persönlich bin ich der Meinung, dass das Codierungsbewusstsein von Notepad++ ziemlich genau ist.
Es gibt viele Coding-Awareness-Algorithmen, wie zum Beispiel dieses Projekt: https://code.google.com/p/ude
Wenn Unicode mit BOM geliefert wird, ist kein Dritter erforderlich. Parteibibliotheken. Es gibt jedoch einige Dinge, die erklärt werden müssen.
Das Problem besteht darin, dass die Textlesemethoden (File-Klasse und StreamReader) in .NET standardmäßig die UTF8-Kodierung lesen, sodass solche GBK-Textdateien direkt mit .NET geöffnet werden (sofern keine Kodierung angegeben ist). muss Kauderwelsch sein!
Die effektivste Lösung besteht hier zunächst darin, die standardmäßige erweiterte ANSI-Kodierung des Systems zu verwenden, bei der es sich um die standardmäßige Nicht-Unicode-Kodierung des Systems zum Lesen von Text handelt:
//输出系统默认非Unicode编码Console.WriteLine(Encoding.Default.EncodingName);//使用系统默认非Unicode编码来打开文件var fileContent = File.ReadAllText("C:\test.txt", Encoding.Default);
in vereinfachtem Chinesisch Das Windows-System sollte Folgendes ausgeben:
Vereinfachtes Chinesisch (GB2312)97c86717cb6990290a39333211193966...
Und die Verwendung dieser Methode ist nicht auf vereinfachtes Chinesisch beschränkt.
Natürlich können Sie auch manuell eine Kodierung angeben, z. B. die GBK-Kodierung. Wenn Sie jedoch die angegebene GBK-Kodierung zum Öffnen einer Unicode-Datei verwenden, wird die Datei dann trotzdem erfolgreich geöffnet? Die Antwort ist immer noch erfolgreich. Der Grund dafür ist, dass .NET beim Öffnen einer Datei standardmäßig automatisch die Stückliste erkennt und die auf der Grundlage der Stückliste erhaltene Codierung zum Öffnen der Datei verwendet. Wenn keine Stückliste vorhanden ist, wird die Datei mit dem vom Benutzer angegebenen Codierungsbereich geöffnet Wenn der Benutzer die Kodierung nicht angibt, wird die UTF8-Kodierung verwendet.
Dieser Parameter „BOM automatisch berücksichtigen“ kann im Konstruktor von StreamReader entsprechend dem Parameter discoverEncodingFromByteOrderMarks festgelegt werden.
Aber es kann nicht in der entsprechenden Methode der File-Klasse festgelegt werden. (Zum Beispiel: File.ReadAllText).
Zum Beispiel verwendet der folgende Code:
GB2312-Kodierung, automatische Erkennung von BOM zum Lesen von GB2312-Text
GB2312-Kodierung, automatische Erkennung von BOM zum Lesen von Unicode-Text
GB2312-Kodierung, Unicode-Text lesen, ohne BOM zu bemerken
static void Main(){ var gb2312 = Encoding.GetEncoding("GB2312"); //用GB2312编码,自动觉察BOM 来读取GB2312文本 ReadFile("gbk.txt", gb2312, true); //用GB2312编码,自动觉察BOM 来读取Unicode文本 ReadFile("unicode.txt", gb2312, true); //用GB2312编码,不觉察BOM 来读取Unicode文本 ReadFile("unicode.txt", gb2312, false);}//通过StreamReader读取文本 static void ReadFile(string path, Encoding enc, bool detectEncodingFromByteOrderMarks){ StreamReader sr; using (sr = new StreamReader(path, enc, detectEncodingFromByteOrderMarks)) { Console.WriteLine(sr.ReadToEnd()); }}
Ausgabe:
a刘a刘???
Die dritte Zeile ist verstümmelt.
Wie Sie oben sehen können, ist die Verwendung der GB2312-Kodierung zum Öffnen von Unicode-Dateien ebenfalls erfolgreich. Da der Parameter „Stückliste automatisch erkennen“ auf „True“ gesetzt ist, erkennt .NET, wenn festgestellt wird, dass die Datei über eine Stückliste verfügt, anhand der Stückliste, dass es sich um eine Unicode-Datei handelt, und verwendet dann Unicode, um die Datei zu öffnen. Wenn keine Stückliste vorhanden ist, werden die angegebenen Codierungsparameter natürlich zum Öffnen der Datei verwendet. Für GB2312-codierten Text gibt es offensichtlich keine Stückliste, daher muss die GB2312-Codierung angegeben werden, andernfalls verwendet .NET die Standard-UTF8-Codierung zum Parsen der Datei und das Ergebnis wird nicht gelesen. Die verstümmelten Zeichen in der dritten Zeile sind darauf zurückzuführen, dass „BOM automatisch erkennen“ auf „Falsch“ gesetzt ist. .NET verwendet direkt die angegebene GB2312-Codierung, um eine Unicode-codierte Textdatei mit BOM zu lesen, was offensichtlich nicht erfolgreich sein kann.
Natürlich können Sie die Stückliste auch selbst bestimmen. Wenn keine Stückliste vorhanden ist, geben Sie eine Standardkodierung zum Öffnen des Textes an. Ich habe darüber in einem früheren Artikel geschrieben (.NET (C#): Codierungserkennung aus Dateien).
Code:
static void Main(){ PrintText("gb2312.txt"); PrintText("unicode.txt");}//根据文件自动觉察编码并输出内容static void PrintText(string path){ var enc = GetEncoding(path, Encoding.GetEncoding("GB2312")); using (var sr = new StreamReader(path, enc)) { Console.WriteLine(sr.ReadToEnd()); }}/// <summary>/// 根据文件尝试返回字符编码/// </summary>/// <param name="file">文件路径</param>/// <param name="defEnc">没有BOM返回的默认编码</param>/// <returns>如果文件无法读取,返回null。否则,返回根据BOM判断的编码或者缺省编码(没有BOM)。</returns>static Encoding GetEncoding(string file, Encoding defEnc){ using (var stream = File.OpenRead(file)) { //判断流可读? if (!stream.CanRead) return null; //字节数组存储BOM var bom = new byte[4]; //实际读入的长度 int readc; readc = stream.Read(bom, 0, 4); if (readc >= 2) { if (readc >= 4) { //UTF32,Big-Endian if (CheckBytes(bom, 4, 0x00, 0x00, 0xFE, 0xFF)) return new UTF32Encoding(true, true); //UTF32,Little-Endian if (CheckBytes(bom, 4, 0xFF, 0xFE, 0x00, 0x00)) return new UTF32Encoding(false, true); } //UTF8 if (readc >= 3 && CheckBytes(bom, 3, 0xEF, 0xBB, 0xBF)) return new UTF8Encoding(true); //UTF16,Big-Endian if (CheckBytes(bom, 2, 0xFE, 0xFF)) return new UnicodeEncoding(true, true); //UTF16,Little-Endian if (CheckBytes(bom, 2, 0xFF, 0xFE)) return new UnicodeEncoding(false, true); } return defEnc; }}//辅助函数,判断字节中的值static bool CheckBytes(byte[] bytes, int count, params int[] values){ for (int i = 0; i < count; i++) if (bytes[i] != values[i]) return false; return true;}
Im obigen Code gibt die GetEncoding-Methode für Unicode-Text die UTF16-Kodierung zurück (genauer gesagt: Sie gibt auch die Big- oder Little-Endian-UTF16-Kodierung entsprechend zurück BOM) und Dateien ohne BOM geben die Standard-GB2312-Kodierung zurück.
Verwandte Beiträge:
.NET(C#): Kodierung aus Dateien erkennen
.NET(C#): Zeichenkodierung (Encoding) und Byte Order Mark (BOM) )
.NET(C#): Verwenden Sie die System.Text.Decoder-Klasse, um „Stream-Text“ zu verarbeiten
.NET(C#): Eine kurze Diskussion der Assembly-Manifest-Ressourcen und RESX-Ressourcen
Das obige ist der detaillierte Inhalt vonBeispiel-Tutorial zum korrekten Lesen chinesisch codierter Dateien in .NET (C#). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!