2014-09-29 19 views
9

"Test" içeriğine sahip bir metin dosyası (UTF-8 kodlaması) var. Bu dosyadan bayt dizisini almayı ve dizeye dönüştürmeyi deniyorum, ancak bir tuhaf karakter içeriyor. Ben şu kodu kullanın:File.ReadAllBytes, File.ReadAllText kullanırken neden farklı sonuç verir?

var path = @"C:\Users\Tester\Desktop\test\test.txt"; // UTF-8 

var bytes = File.ReadAllBytes(path); 
var contents1 = Encoding.UTF8.GetString(bytes); 

var contents2 = File.ReadAllText(path); 

Console.WriteLine(contents1); // result is "?test" 
Console.WriteLine(contents2); // result is "test" 

conents1contents2 farklıdır - neden?

cevap

2

Bu UTF8 kodlama önek dizesidir. Dosyayı kodlanmış UTF8 olarak işaretler. ReadAllText, bir ayrıştırma talimatı olduğu için döndürmez.

5

zamanda ReadAllText's documentation açıklandığı:

Bu yöntem, otomatik bayt sırası işaretlerinin varlığına dayanan bir dosyanın kodlama tespit etmeye çalışır. UTF-8 ve UTF-32 kodlama formatları (hem büyük hem de ender endian) tespit edilebilir.

Yani dosya BOM ( Byte order mark) içerir ve ilk yöntem sadece hiç bunları yorumlayarak olmadan, düz bayt okur iken ReadAllText yöntemi doğru, bunu yorumlar.

bir dize

(vurgu benim) içine Belirtilen bayt dizideki tüm bayt kodunu çözer:

Encoding.GetString yalnızca söylüyor. Elbette ki tam olarak kesin değil, ama örneğiniz bunun kelimenin tam anlamıyla alındığını gösteriyor.

4

Büyük olasılıkla dosyanın başında Unicode BOM (bayt sırası işareti) görüyorsunuz. File.ReadAllText bunu nasıl kestireceğini biliyor, ancak Encoding.UTF8 yapmıyor.

+0

character (int) content1 [0] 'karakterinin ilk karakterini işaretlerseniz, bu char'ın BOM karakteri olduğunu görürsünüz. Daha fazla bilgi: http://stackoverflow.com/questions/6784799/what-is-this-char-65279 – kpull1

İlgili konular