Código de reprodução:
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();
}
}
A página de código 1252 é um acidente bastante comum na Inglaterra, pois é a página de código padrão do Windows lá. Como é para a Europa Ocidental e as Américas. Vários motivos para alterar a propriedade padrão Console.OutputEncoding programaticamente, muitos arquivos de texto serão codificados em 1252. Ou na linha de comando, digitandochcp 1252
(chcp == alterar a página de código) antes de iniciar o programa.
Como você pode ver no conjunto de caracteres suportado por 1252, o símbolo Infinito não está disponível. Portanto, a codificação precisa de um substituto. Esse geralmente é o ?
glifo para pontos de código Unicode não suportados, o valor da propriedade Encoding.EncoderFallback para codificações de 8 bits. Mas, para 1252, e as páginas de códigos herdadas do MS-Dos 850 e 858, o programador da Microsoft decidiu8
. Cara engraçado.
O glifo é suportado na página de códigos usual para aplicativos de console em uma máquina Western. Qual é 437, corresponde ao conjunto de caracteres herdado da IBM . Ter esse tipo de desastre de codificação é o motivo pelo qual o Unicode foi inventado. Infelizmente, é tarde demais para resgatar aplicativos de console, muito código em torno dele se baseia na página de código padrão do MS-Dos.
A conversão de Double.PositiveInfinity para "∞" é específica do Win10. Costumava ser "Infinito" nas versões anteriores do Windows. Normalmente, esses tipos de formatos podem ser modificados com o botão Painel de controle> Idioma> Alterar formatos de data, hora ou número> Configurações adicionais, mas a seleção do símbolo de infinito não está incluída na caixa de diálogo. Também não é coberto pelo registro (HKCU \ Control Panel \ International), mas por uma grande supervisão. É LOCALE_SPOSINFINITY no winapi nativo. Em um programa .NET, você pode substituí-lo programaticamente, clonando o CultureInfo e alterando sua propriedade NumberFormatInfo.PositiveInfinitySymbol. Como isso:
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();
}
}
∞
é o sinal do infinito. basta girá-lo 90 graus para vê-lo 8