Warum ist infinity gedruckt als "8" in der Windows-10-Konsole?
War ich testen, was zurückgegeben wurde aus der Abteilung einschließlich der Nullen, d.h. 0/1
, 1/0
und 0/0
. Dafür habe ich etwas ähnlich dem folgenden:
Console.WriteLine(1d / 0d);
Aber dieser code druckt 8
nicht Infinity
oder eine andere string-Konstante wie PositiveInfinity
.
Vollständigkeit halber alle folgenden print -8
:
Console.WriteLine(1d / 0d);
double value = 1d / 0d;
Console.WriteLine(value);
Console.WriteLine(Double.PositiveInfinity);
Sowie Console.WriteLine(Double.NegativeInfinity);
Drucke -8
.
Warum dieser Unendlichkeit print 8?
Für diejenigen von Euch, die scheinen zu denken, dies ist ein infinity-symbol nicht acht das folgende Programm:
Console.WriteLine(1d / 0d);
double value = 1d / 0d;
Console.WriteLine(value);
Console.WriteLine(Double.PositiveInfinity);
Console.WriteLine(8);
Ausgänge:
Sehen Sie
Sind Sie sicher, dass es eine tatsächliche
Bitte tun Sie, was Sinatr vorgeschlagen, oder drucken Sie die Ausgabe von
Dies scheint ein Windows-10-problem. In Windows 8.1 hatte ich eine infinity-symbol. Aktualisiert vor ein paar Tagen auf Windows 10 und nun habe ich eine
Ein quick-check wäre zu sehen, was passiert, für
∞
ist das Zeichen der Unendlichkeit. nur drehen Sie Sie um 90 Grad, um es zu sehen 8Sind Sie sicher, dass es eine tatsächliche
8
, nicht in irgendeinem komischen Unicode-Zeichen für die Unendlichkeit, um 90 Grad gedreht? Das könnte sich ändern, basierend auf Ihrem Gebietsschema. Ich versuchte es auf dotnetfiddle.net, und es gibt Infinity
.Bitte tun Sie, was Sinatr vorgeschlagen, oder drucken Sie die Ausgabe von
Double.PositiveInfinity.ToString()[0] == '8'
. Es gibt einige exotische Zeichen, die sehr ähnlich Aussehen, um andere in einigen Schriften. Auch, was Sprache ist Ihr computer konfiguriert?Dies scheint ein Windows-10-problem. In Windows 8.1 hatte ich eine infinity-symbol. Aktualisiert vor ein paar Tagen auf Windows 10 und nun habe ich eine
8
auch (Deutsche locale).Ein quick-check wäre zu sehen, was passiert, für
Console.Write("∞");
InformationsquelleAutor TheLethalCoder | 2016-12-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sicher sein, dass die floating-point-Wert ist
+Infinity
wenn der Zähler eine floating point division by zero ist das positiv-Infinity
wenn der Zähler eine Fließkomma-division durch null ist negativ, undNaN
wenn Zähler und Nenner eine floating point division sind beide null. Das ist in der IEEE754-Fließkomma-Spezifikation, das ist das, was C# verwendet.In Ihrem Fall, die Konsole wird die Umwandlung der Unendlichkeit-symbol (das ist manchmal vertreten typographisch wie eine horizontale 8 — ∞) zu einer senkrechten 8.
dotnetfiddle.net/rLilOT
Habe ich falsch verstanden, die Antwort, aber das wirft die Fragen auf, warum es konvertieren es in eine 8? Und warum haben manche Geigen/Konsolen drucken der string-literal
Es heißt "lemniscate". Es hat einen unicode-Wert: ∞
Dies erklärt wahrscheinlich, warum Buzz Lightyear sagt "Auf Acht Und darüber Hinaus!", wenn ich das Spiel Toy Story auf meinem PC. 😉
InformationsquelleAutor Bathsheba
Bestimmte Einstellungen (z.B. Kombination von Kulturen, output encoding, etc.) .NETTO wird die Ausgabe der Unicode-infinity-Zeichen ∞ (∞ /∞). Die Windows-10-Konsole/terminal-emulator (wieder einmal bestimmte Einstellungen - siehe screenshot unten) - Anzeige diese Unicode-Zeichen wie eine 8.
Beispielsweise auf Windows 10, mit dem unter Einstellungen (beachten Sie die code-Seite) einfach einfügen ∞ in die console zeigt als 8.
BEARBEITEN
Danke an Kommentar von Chris:
Es scheint, dass die Ausgabe-schriftart in Kombination mit der code-Seite ist verantwortlich für die ∞ => 8 Ausgabe auf der Konsole. Wie ihm bekomme ich die richtige Anzeige von ° in alle TrueType-Schriftarten, die ich ausprobiert habe und nur die " 8 "angezeigt, wenn das raster-Schriftarten" ausgewählt ist.
Wenn die Antwort richtig ist, dass bestimmte Einstellungen kann die Ursache für dieses Problem bei der Anzeige der zweiten Hälfte ist falsch. Meine Optionen derzeit suchen genau das gleiche wie deins oben, und ich bekomme die richtige ∞ eher als eine 8. Nur kann ich es zeigen, eine 8, wenn ich gehen, um die Schriften-Seite und wählen Sie "raster-fonts" aus der Liste der verfügbaren Schriftarten. Consolas, Courier New und die anderen scheinen alle anzeigen fein...
Es ist definitiv eine Kombination aus beiden Faktoren, da die Einstellung der schriftart, Raster, wenn die codepage 437 ist, zeigt auch heute noch das symbol korrekt. Nur wenn beide Bedingungen erfüllt sind, scheint dies zu passieren (zumindest für mich).
InformationsquelleAutor tolanj
Den
8
symbol tritt auf, wenn Windows konvertiert Unicode an einen legacy character encoding. Da es keine Unendlichkeit-symbol in der legacy-Kodierung, verwendet es eine "best-fit" - symbol, standardmäßig, die in diesem Fall ist die Zahl 8. Hier sehen Sie ein Beispiel für Microsofts "windows-1252" - Codierung. Anscheinend, Windows 10 noch Verwendungen, von alten Zeichenkodierungen, die standardmäßig in der Konsole (siehe "Code Pages")."Offenbar Windows 10 verwendet immer noch den alten Zeichenkodierungen, die standardmäßig in der Konsole" NÖ, mein Windows 10 cmd.exe hat legacy-Codierung deaktiviert out of the box.
Dies ist die beste Lösung IMHO. Eigentlich kann man auch sehen, das die " 8 " Zeichen an position 0x2440 zumindest auf meinem Windows-10-box in der c:\windows\system32\c_1252.nls Datei (infinity ist 0x221E, und die Datei hat einige header erklärt, dass das offset). Alle codepage-Kodierung haben einen entsprechenden .nls-Datei. Standardmäßig wird die Konsole verwendet Codepage 1252 (Windows-1252). Hinweis: diese Zuordnungen nicht eingehalten werden, überprüfen Sie diese: blogs.msdn.microsoft.com/shawnste/2007/09/24/...
InformationsquelleAutor Peter O.
Anmerkung: Die implizite
.ToString()
Aufruf der Methode beim schreibenDouble.PositiveInfinity
Konsole ist verantwortlich für dieses Verhalten.Aufrufen
Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("en-Us")));
Ergebnisse in der Zeichenfolge "Infinity"
während
Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("fr-Fr")));
Ergebnisse in "+Infini".
Edit: Wie andere haben darauf hingewiesen, in den commets, können Sie nicht vollständig bestätigen meine Ergebnisse. Testen diese auf einem anderen Rechner, bekomme ich die Zeichen
∞
für beide Anrufe.Ausgabe für alle Kulturen, Dank vtortola in die Kommentare.
Fand ich einen (wahrscheinlich) Antwort:
Mit
Console.OutputEncoding = Encoding.Unicode;
ich kann neu erschaffen werden, das Verhalten, das Sie erleben, sind für einige Kulturen, z.B. "ru", "ru-RU" produzieren Sie die Ausgabe8
.Ich bekomme
Infinity
in beiden. Das ist die Kultur, die Ihre app ausgeführt wird? Überprüfen SieThread.CurrentThread.CurrentCulture
undThread.CurrentThread.CurrentUICulture
.D. Ptæus tbh, die ich nicht sehen kann jede Kultur die Erzeugung eines
8
dotnetfiddle.net/QYhXMuSie sind zu Recht über die implizite
.ToString()
. Am EndeToString()
zurück.PositiveInfinitySymbol
relevantenNumberFormatInfo
. Diese scheinen zu hängen, auf der die version der Laufzeitumgebung und/oder die Windows-version (OS oder was auch immer). In den alten Tagen,CultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbol
wäre gleich"Infinity"
, aber mit neueren Versionen der Laufzeitumgebung und Betriebssystem ist es"∞"
statt. Ich fragte dies in einem Kommentar zu Hans Passant die Antwort in diesem thread.InformationsquelleAutor Søren D. Ptæus
Repro-code:
Codepage 1252 ist ein ziemlich häufiger Unfall in England, da es das Standard-Windows-Codepage es. Wie es für Westeuropa und Nord-und Südamerika. Viele Gründe zum ändern der Standard-Konsole.OutputEncoding-Eigenschaft programmgesteuert, viele text-Dateien werden verschlüsselt im Jahre 1252. Oder von der Kommandozeile durch Eingabe von
chcp 1252
(chcp == code ändern, Seite) vor dem starten des Programms.Wie Sie sagen können, aus der Zeichensatz unterstützt von 1252, das Infinity-symbol ist nicht verfügbar. Also die Codierung hat sich mit einem Ersatz. Das ist Häufig der
?
Symbol für nicht unterstützte Unicode-codepoints, die Codierung.EncoderFallback-Eigenschaft-Wert für 8-bit-Kodierungen. Aber für 1252, und das alte MS-Dos 850 und 858-code Seiten, die Microsoft-Programmierer beschlossen, für8
. Lustiger Kerl.Die Glyphe ist unterstützt die üblichen Codepage für die Konsole apps auf einer westlichen Maschine. Die 437, entspricht das legacy-IBM-Zeichensatz. Diese Art der Codierung von Katastrophen ist, warum Unicode erfunden wurde. Leider zu spät, um rescue console apps, viel zu viel code um, stützte sich auf die Standard-MS-Dos-code-Seite.
Gleich Doppelt.Positiveinfinity gibt umgewandelt "∞" ist spezifisch für Win10. Es verwendet, um "Unendlich" in früheren Windows-Versionen. Diese Formate können in der Regel geändert werden, mit Control Panel > Language - > Ändern Sie Datum, Uhrzeit oder Zahlenformate > Zusätzliche Schaltfläche Einstellungen, aber die infinity-symbol-die Auswahl ist nicht enthalten in den dialog. Auch nicht abgedeckt durch die registry (HKCU\Control Panel\International"), eher eine große Beaufsichtigung. Es ist LOCALE_SPOSINFINITY in die native winapi. In einer .NET-Programm, das Sie außer Kraft setzen kann programmgesteuert durch das Klonen der CultureInfo-und verändert seine NumberFormatInfo.PositiveInfinitySymbol Eigenschaft. Wie diese:
ý
statt∞
. Es hat mir auch gezeigt, dass die Verwendung von nicht-raster-Schriftarten vermeidet das problem.Ist es die version von der .NET runtime, oder die Windows-version (OS oder was auch immer), oder eine Kombination, die bestimmt, ob
CultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbol
gibt"Infinity"
oder"∞"
(oder etwas anderes)? Sie sagen weiter oben, dass es speziell für Windows 10, und ich bin damit einverstanden, es wurde irgendwann geändert. Aber wenn ich eine Anwendung ausführen, die unter Windows 8 mit den "gleichen" version von der .NET Framework, bekomme ich ein anderes Ergebnis als mit Windows 10?Dieses problem beginnt mit Windows, dann macht Laune .NET. Win8 noch begünstigt "Infinity"
Bestätigt! Ich habe gerade angemeldet in einer Windows Server 2012 R2-Maschine (entspricht etwa Windows 8.1), und ich weiß, es hat die neueste .NET Framework, und es hat auch die neueste Windows-PowerShell. In PowerShell
$PSVersionTable
zeigt die PS-version ist etwas mit 5.1. Das PowerShell-Ziele .NET Framework-CLR () version 4.* was ich weiß, ist die neue Maschine. Noch[cultureinfo]::GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbol
von Windows PowerShell gibtInfinity
, nicht∞
(aktuelle Kulturen-US
). Fazit: Windows-version entscheidet, nicht .NET-version.InformationsquelleAutor Hans Passant
"8" für die Unendlichkeit wird an der Konsole angezeigt, wenn ausgeführt .Net 4 und höher, ansonsten Vorherige Versionen anzeigen "Infinity".
Verwenden Der Konsole.OutputEncoding = Encoding.Unicode -; in .Net 4 und höher bekommen wird unendlich angezeigt ∞, aber wirft eine IOException, die in früheren Versionen.
HINWEIS: ich bin mit Visual Studio 2015 Community Edition auf Windows 10 64-bit
InformationsquelleAutor JTC