Repro kodu:
using System;
using System.Text;
class Program {
static void Main(string[] args) {
var infinity = "\u221e";
Console.OutputEncoding = Encoding.GetEncoding(1252);
Console.WriteLine(infinity);
Console.ReadLine();
}
}
Kod sayfası 1252, oradaki varsayılan Windows kod sayfası olduğu için İngiltere'de oldukça yaygın bir kazadır. Batı Avrupa ve Amerika için olduğu gibi. Varsayılan Console.OutputEncoding özelliğini programla değiştirmek için birçok neden, birçok metin dosyası 1252'de kodlanacaktır. Veya chcp 1252
programı başlatmadan önce komut satırından (chcp == kod sayfasını değiştir) yazarak .
1252 tarafından desteklenen karakter setinden de anlayabileceğiniz gibi Sonsuzluk sembolü mevcut değil. Bu yüzden Kodlama bir ikame ile gelmelidir. Bu genellikle ?
desteklenmeyen Unicode kod noktaları için glif, 8 bit kodlamalar için Encoding.EncoderFallback özellik değeridir. Ancak 1252 ve eski MS-Dos 850 ve 858 kod sayfaları için Microsoft programcısı karar verdi 8
. Komik adam.
Glif , bir Western makinedeki konsol uygulamaları için normal kod sayfasında desteklenir. 437 olan eski IBM karakter kümesiyle eşleşir . Bu tür kodlama felaketlerine sahip olmak, Unicode'un icat edilmesinin nedenidir. Ne yazık ki konsol uygulamalarını kurtarmak için çok geç, varsayılan MS-Dos kod sayfasına dayanan çok fazla kod var.
Double.PositiveInfinity'nin "∞" 'a dönüştürülmesi Win10'a özgüdür. Önceki Windows sürümlerinde "Infinity" idi. Bu tür biçimler normalde Denetim Masası> Dil> Tarihi, saati veya sayı biçimlerini değiştir> Ek Ayarlar düğmesi ile değiştirilebilir ancak sonsuzluk sembolü seçimi iletişim kutusuna dahil edilmez. Ayrıca kayıt defteri tarafından kapsanmaz (HKCU \ Control Panel \ International), daha ziyade büyük bir gözetim. Yerel winapi'de LOCALE_SPOSINFINITY. Bir .NET programında, CultureInfo'yu klonlayarak ve NumberFormatInfo.PositiveInfinitySymbol özelliğini değiştirerek program aracılığıyla geçersiz kılabilirsiniz. Bunun gibi:
using System;
using System.Text;
using System.Threading;
using System.Globalization;
class Program {
static void Main(string[] args) {
Console.OutputEncoding = Encoding.GetEncoding(1252);
var ci = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
ci.NumberFormat.NegativeInfinitySymbol = "-Infinity";
ci.NumberFormat.PositiveInfinitySymbol = "And beyond";
Thread.CurrentThread.CurrentCulture = ci;
Console.WriteLine(1 / 0.0);
Console.ReadLine();
}
}
∞
, sonsuzluğun işaretidir. görmek için 90 derece