ทำไมอินฟินิตี้จึงถูกพิมพ์เป็น“ 8” ในคอนโซล Windows 10


146

ฉันถูกทดสอบสิ่งที่ได้กลับมาจากการแบ่งรวมศูนย์เช่น0/1, และ1/0 0/0สำหรับสิ่งนี้ฉันใช้บางสิ่งที่คล้ายกับที่แสดงต่อไปนี้:

Console.WriteLine(1d / 0d);

แต่รหัสนี้พิมพ์8ไม่ได้Infinityหรือบางส่วนคงที่สตริงอื่น ๆ PositiveInfinityเช่น

เพื่อความสมบูรณ์ของการพิมพ์ทั้งหมดต่อไปนี้8:

Console.WriteLine(1d / 0d);

double value = 1d / 0d;
Console.WriteLine(value);

Console.WriteLine(Double.PositiveInfinity);

และภาพพิมพ์Console.WriteLine(Double.NegativeInfinity);-8

ทำไมอินฟินิตี้นี้จึงพิมพ์ 8?


สำหรับคนที่คิดว่านี่เป็นสัญลักษณ์อินฟินิตี้ไม่ใช่โปรแกรมต่อไปนี้แปด:

Console.WriteLine(1d / 0d);

double value = 1d / 0d;
Console.WriteLine(value);

Console.WriteLine(Double.PositiveInfinity);

Console.WriteLine(8);

ขาออก:

เอาท์พุท Inifinity


69
คุณเห็นเป็นสัญลักษณ์ของอินฟินิตี้ แค่พลิก 90 องศาเพื่อดู 8
Mohit Shrivastava

23
คุณแน่ใจหรือว่ามันเป็นจริง8ไม่ใช่อักขระ Unicode แปลก ๆ สำหรับอินฟินิตี้หมุน 90 องศา? สิ่งนี้อาจเปลี่ยนแปลงไปตามตำแหน่งที่ตั้งของคุณ ฉันลองบนdotnetfiddle.netแล้วก็พิมพ์Infinityออกมา
Kroltan

4
@TheLethalCoder โปรดทำในสิ่งที่ Sinatr Double.PositiveInfinity.ToString()[0] == '8'ปัญหาหรือพิมพ์การส่งออกของ มีตัวละครแปลก ๆ บางตัวที่มีลักษณะคล้ายกับตัวอักษรอื่นในแบบอักษรบางตัว คอมพิวเตอร์ของคุณกำหนดค่าให้เป็นภาษาอะไร
Kroltan

15
นี่เป็นปัญหาของ Windows 10 ใน Windows 8.1 ฉันมีสัญลักษณ์อินฟินิตี้ อัปเกรดเป็น Windows 10 ไม่กี่วันที่ผ่านมาและตอนนี้ฉันก็มี8เช่นกัน (ภาษาเยอรมัน)
René Vogt

13
ตรวจสอบอย่างรวดเร็วคือการดูว่าเกิดอะไรขึ้นConsole.Write("∞");
Jon Hanna

คำตอบ:


110

ตรวจสอบให้แน่ใจว่าค่าจุดลอยตัวคือ+Infinityถ้าตัวเศษของการหารจุดทศนิยมด้วยศูนย์เป็นบวก-Infinityถ้าเศษของการหารจุดลอยเป็นศูนย์เป็นลบและNaNถ้าเศษและตัวหารของการหารจุดลอยเป็นศูนย์ทั้งสอง ที่อยู่ในสเปคจุดลอย IEEE754ซึ่งเป็นสิ่งที่ C # ใช้

ในกรณีของคุณคอนโซลกำลังแปลงสัญลักษณ์อินฟินิตี้ (ซึ่งบางครั้งจะแสดงแบบอักษรเป็นแนวนอน 8 - ∞) เป็นแนวตั้ง 8


13
@TheLethalCoder รูปภาพไม่ได้พิสูจน์คำตอบนี้เนื่องจากเป็นรูปภาพคอนโซลของคุณ
Rob

9
@ Rob ฉันอ่านคำตอบผิด ๆ แต่นั่นทำให้เกิดคำถามขึ้นมาทำไมมันถึงแปลงเป็น 8? และทำไมบางคนเล่นปริศนา / คอนโซลพิมพ์ตัวอักษรสตริง
TheLethalCoder

1
นี่น่าจะเป็นกรณีที่ใช้ดีบักเกอร์ฉันเห็นสัญลักษณ์อินฟินิตี้ (เช่นแนวนอน 8) มีเหตุผลใดที่คอนโซลของฉันจะแปลงเป็น 8 ในขณะที่คนอื่น ๆ ดูเหมือนว่าจะใช้Infinityหรือคล้ายกันแม้ว่าฉันจะใช้รหัสจากคำตอบโดย โซเรนโดยระบุวัฒนธรรม
TheLethalCoder

4
มันเรียกว่า "lemniscate" มันมีค่ายูนิโค้ด: ∞
BlueRaja - Danny Pflughoeft

14
นี่อาจอธิบายได้ว่าทำไม Buzz Lightyear จึงพูดว่า "ถึงแปดต่อไป!" เมื่อฉันเล่น Toy Story บนพีซีของฉัน ;)
DeanOC

70

รับการตั้งค่าบางอย่าง (เช่นการรวมกันของวัฒนธรรมการเข้ารหัสเอาท์พุท ฯลฯ ). NET จะแสดงผลอักขระ Unicode infinity ∞ (∞ / & # 8734;) ตัวจำลองคอนโซล / เทอร์มินัล Windows 10 (จะได้รับการตั้งค่าบางอย่างอีกครั้ง - ดูภาพหน้าจอด้านล่าง) แสดงอักขระ Unicode นี้เป็น 8

ตัวอย่างเช่นบน Windows 10 ด้วยการตั้งค่าด้านล่าง (หมายเหตุหน้ารหัส) เพียงวาง∞ลงในคอนโซลแสดงเป็น 8

การตั้งค่าการทำซ้ำ

แก้ไข

ด้วยความเห็นขอบคุณจากChris : ดูเหมือนว่าฟอนต์เอาต์พุตร่วมกับโค้ดเพจจะรับผิดชอบปัญหา issue => 8 บนคอนโซล เช่นเขาฉันได้รับการแสดงที่เหมาะสมของ of ในแบบอักษร TrueType ทั้งหมดที่ฉันได้ลองและเห็นเพียง 8 เมื่อเลือกแบบอักษรแรสเตอร์ '

การตั้งค่าแบบอักษร


1
Mine แสดงสัญลักษณ์อนันต์ที่ด้านข้างแทนที่จะเป็น "8" เมื่อวางในคอนโซลแม้ว่าฉันจะใช้ "437 (OEM - สหรัฐอเมริกา)"
Derek 朕會功夫

3
แม้ว่าคำตอบจะถูกต้องว่าการตั้งค่าบางอย่างอาจทำให้เกิดปัญหาการแสดงผลนี้ในช่วงครึ่งหลังไม่ถูกต้อง ขณะนี้ตัวเลือกของฉันมีลักษณะเหมือนกับของคุณด้านบนและฉันได้รับ correct ที่ถูกต้องแทนที่จะเป็น 8 ฉันสามารถทำให้มันแสดงเป็น 8 ถ้าฉันไปที่หน้าแบบอักษรและเลือก "แบบอักษรแรสเตอร์" จากรายการของแบบอักษรที่มีอยู่ Consolas, Courier New และคนอื่น ๆ ทุกคนดูเหมือนจะแสดงมันออกมาได้ดี ...
Chris

มันเป็นการรวมกันของสองปัจจัยอย่างแน่นอนเนื่องจากการตั้งค่าแบบอักษรเป็น Raster เมื่อเพจรหัสคือ 437 ยังคงแสดงสัญลักษณ์อย่างถูกต้อง เฉพาะในกรณีที่เป็นไปตามเงื่อนไขทั้งสองข้อนี้ดูเหมือนจะเกิดขึ้น (อย่างน้อยสำหรับฉัน)
Moshe Katz

39

8สัญลักษณ์เกิดขึ้นเมื่อ Windows แปลง Unicode กับการเข้ารหัสอักขระมรดก เนื่องจากไม่มีสัญลักษณ์อินฟินิตี้ในการเข้ารหัสแบบเดิมจะใช้"แบบที่ดีที่สุด" เพื่อเป็นสัญลักษณ์ว่าโดยเริ่มต้นซึ่งในกรณีนี้คือหมายเลข 8 ดูตัวอย่างสำหรับไมโครซอฟท์ "1252 หน้าต่าง" การเข้ารหัส เห็นได้ชัดว่า Windows 10 ยังคงใช้การเข้ารหัสอักขระดั้งเดิมโดยค่าเริ่มต้นในคอนโซล (ดู"รหัสหน้า" )


11
ฉันสงสัยว่าทำไม "8" จึงถือว่าเหมาะสมดีเมื่อมีความหมายเพื่อให้เกิดความสับสน? ตัวละครอื่น ๆ ในหน้ารหัส 437 น่าจะเหมาะกว่าเช่นเครื่องหมายองศาหรือเครื่องหมายต่อพัน (a% ที่มีสองด้านล่างของเครื่องหมายทับ) ไม่มีสิ่งใดที่จะดีเท่ากับเครื่องหมายอินฟินิตี้ที่แท้จริง แต่ดูเหมือนว่าพวกเขาจะมีแนวโน้มที่จะเกิดความสับสนน้อยลง
supercat

"เห็นได้ชัดว่า Windows 10 ยังคงใช้การเข้ารหัสอักขระดั้งเดิมโดยค่าเริ่มต้นในคอนโซล" Nope, Windows 10 cmd.exe ของฉันมีการเข้ารหัสแบบดั้งเดิมถูกปิดใช้งานนอกกรอบ
Lightness Races ใน Orbit

นี่คือคำตอบที่ดีที่สุด IMHO ที่จริงแล้วคุณสามารถเห็นอักขระ '8' ที่ตำแหน่ง 0x2440 อย่างน้อยในกล่อง Windows 10 ของฉันในไฟล์ c: \ windows \ system32 \ c_1252.nls ( อินฟินิตี้คือ 0x221E และไฟล์มีส่วนหัวที่อธิบายออฟเซ็ต) . การเข้ารหัสรหัสเพจทั้งหมดมีไฟล์. nls ที่สอดคล้องกัน โดยค่าเริ่มต้นคอนโซลใช้หน้ารหัส 1252 (Windows 1252) หมายเหตุการแมปเหล่านี้จะไม่ได้รับการบำรุงรักษาตรวจสอบสิ่งนี้: blogs.msdn.microsoft.com/shawnste/2007/09/24/…
Simon Mourier

35

หมายเหตุ: .ToString()การเรียกเมธอดโดยนัยเมื่อการเขียนDouble.PositiveInfinityไปยังคอนโซลมีหน้าที่รับผิดชอบต่อพฤติกรรมนี้

การเรียกร้อง Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("en-Us")));

ผลลัพธ์ในสตริง "Infinity"

ในขณะที่Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("fr-Fr"))); ผลลัพธ์เป็น "+ Infini"

แก้ไข: ตามที่คนอื่น ๆ ชี้ไปที่คอมมาพวกเขาไม่สามารถยืนยันผลลัพธ์ของฉันได้ทั้งหมด ทดสอบสิ่งนี้กับเครื่องอื่นฉันได้รับตัวละครสำหรับการโทรทั้งคู่

ผลผลิตสำหรับทุกวัฒนธรรมต้องขอบคุณvtortolaในความคิดเห็น


ฉันพบคำตอบ (น่าจะ):

ใช้Console.OutputEncoding = Encoding.Unicode;ฉันสามารถสร้างพฤติกรรมที่คุณกำลังประสบหลายวัฒนธรรมเช่น "RU", "RU-RU" 8การผลิตการส่งออก


1
ฉันได้ลองตัวอย่างของคุณและพวกเขาทั้งคู่พิมพ์ 8
TheLethalCoder

1
@TheLethalCoder ฉันได้รับInfinityทั้ง แอปของคุณใช้งานวัฒนธรรมใดอยู่ ตรวจสอบและThread.CurrentThread.CurrentCulture Thread.CurrentThread.CurrentUICulture
vtortola

8
@ Søren D. Ptæus tbh ฉันไม่สามารถมองเห็นวัฒนธรรมใด ๆ ที่สร้าง8 dotnetfiddle.net/QYhXMu
vtortola

1
.ToString()คุณมีสิทธิเกี่ยวกับนัย ในท้ายที่สุดToString()จะกลับจากที่เกี่ยวข้อง.PositiveInfinitySymbol NumberFormatInfoสิ่งเหล่านี้ดูเหมือนจะขึ้นอยู่กับเวอร์ชั่นของรันไทม์และ / หรือเวอร์ชั่นของ Windows (หรือระบบปฏิบัติการอะไรก็ตาม) ในสมัยก่อนCultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbolจะเท่ากับ"Infinity"แต่ด้วยเวอร์ชันรันไทม์และระบบปฏิบัติการเวอร์ชันใหม่กว่าจะเป็น"∞"แทน ฉันเพิ่งถามเกี่ยวกับมันในความคิดเห็นต่อคำตอบของ Hans Passant ในหัวข้อนี้
Jeppe Stig Nielsen

16

รหัส Repro:

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();
    }
}

รหัสหน้า 1252 เป็นอุบัติเหตุที่เกิดขึ้นบ่อยในอังกฤษเนื่องจากเป็นรหัสหน้าเริ่มต้นของ Windows ที่นั่น มันเป็นสำหรับยุโรปตะวันตกและอเมริกา เหตุผลมากมายในการเปลี่ยนค่าเริ่มต้นคุณสมบัติ Console.OutputEncoding โดยทางโปรแกรมไฟล์ข้อความจำนวนมากจะถูกเข้ารหัสใน 1252 หรือจากบรรทัดคำสั่งโดยพิมพ์chcp 1252(chcp == หน้าเปลี่ยนรหัส) ก่อนเริ่มโปรแกรม

อย่างที่คุณสามารถบอกได้จากชุดอักขระที่สนับสนุนโดย 1252 สัญลักษณ์อินฟินิตี้ไม่สามารถใช้ได้ ดังนั้นการเข้ารหัสจะต้องเกิดขึ้นพร้อมกับตัวแทน นั่นคือ?glyph สำหรับ codepoints ที่ไม่รองรับ Unicode, ค่าคุณสมบัติ Encoding.EncoderFallback สำหรับการเข้ารหัส 8 บิต แต่สำหรับ 1252 และหน้ามรดก MS-DOS 850 และ 858 8รหัสโปรแกรมไมโครซอฟท์ตัดสินใจ ผู้ชายตลก.

สัญลักษณ์จะได้รับการสนับสนุนในหน้ารหัสปกติสำหรับแอพพลิเคคอนโซลบนเครื่องตะวันตก ซึ่งเป็น 437, ตรงกับมรดกไอบีเอ็มชุดอักขระ การมีภัยพิบัติในการเข้ารหัสประเภทนี้คือสาเหตุที่ Unicode ถูกประดิษฐ์ขึ้น น่าเสียดายที่สายเกินไปที่จะช่วยเหลือแอพคอนโซลไกลเกินไปรหัสมากเกินไปที่อาศัยหน้ารหัส MS-Dos เริ่มต้น

การมี Double.PositiveInfinity ถูกแปลงเป็น "∞" เป็นสิ่งเฉพาะสำหรับ Win10 เคยเป็น "Infinity" ในเวอร์ชั่น Windows ก่อนหน้านี้ รูปแบบชนิดเหล่านี้สามารถแก้ไขได้ด้วยแผงควบคุม> ภาษา> เปลี่ยนวันที่เวลาหรือรูปแบบตัวเลข> ปุ่มการตั้งค่าเพิ่มเติม แต่การเลือกสัญลักษณ์อินฟินิตี้ไม่รวมอยู่ในกล่องโต้ตอบ ยังไม่ครอบคลุมโดยรีจิสทรี (HKCU \ Control Panel \ International) ค่อนข้างเป็นเรื่องใหญ่ มันคือ LOCALE_SPOSINFINITY ใน winapi ดั้งเดิม ในโปรแกรม. NET คุณสามารถเขียนทับโปรแกรมโดยการโคลน CultureInfo และเปลี่ยนคุณสมบัติ NumberFormatInfo.PositiveInfinitySymbol แบบนี้:

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();
    }
}

รหัสของคุณอนุญาตให้ฉันเพื่อยืนยัน WinXP ใช้รหัส 437 หน้าซึ่งใน Windows 10 ตอนนี้พิมพ์แทนý นอกจากนี้ยังแสดงให้ฉันเห็นว่าการใช้แบบอักษรที่ไม่ใช่แรสเตอร์ช่วยหลีกเลี่ยงปัญหา
Mark Hurd

มันเป็นรุ่นของ. NET runtime หรือรุ่นของ Windows (หรือระบบปฏิบัติการอะไรก็ตาม) หรือชุดค่าผสมที่กำหนดว่าCultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbolจะให้"Infinity"หรือไม่"∞"(หรืออย่างอื่น) คุณพูดไปแล้วว่ามันเฉพาะกับ Windows 10 และฉันเห็นด้วยว่ามันมีการเปลี่ยนแปลงในบางครั้ง แต่ถ้าฉันใช้แอพพลิเคชั่นบน Windows 8 ด้วย. NET Framework เวอร์ชั่นเดียวกันฉันจะได้ผลลัพธ์ที่แตกต่างจาก Windows 10 หรือไม่?
Jeppe Stig Nielsen

ปัญหานี้เริ่มต้นด้วย Windows จากนั้นแสดงการเล่นโวหารใน. NET Win8 ยังคงโปรดปราน "Infinity"
Hans Passant

1
ได้รับการยืนยัน! ฉันเพิ่งลงชื่อเข้าใช้เครื่อง Windows Server 2012 R2 (ตรงกับ Windows 8.1) และฉันรู้ว่ามันมี. NET Framework ใหม่ล่าสุดและยังมี Windows PowerShell ใหม่ล่าสุด ใน PowerShell $PSVersionTableแสดงให้เห็นว่าเวอร์ชั่น PS เป็นอะไรที่มี 5.1 PowerShell นั้นตั้งเป้ารุ่น. NET Framework (CLR) 4 * ซึ่งฉันรู้ว่าเป็นของใหม่ในเครื่องนั้น ยังคง[cultureinfo]::GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbolมาจาก Windows PowerShell Infinityแต่ไม่ใช่(วัฒนธรรมปัจจุบันen-US) สรุป: รุ่น Windows ตัดสินใจไม่ใช่รุ่น NET
Jeppe Stig Nielsen

0

"8" สำหรับอินฟินิตี้จะแสดงในคอนโซลเมื่อใช้. Net 4 ขึ้นไปมิฉะนั้นรุ่นก่อนหน้าจะแสดง "Infinity"

ใช้ Console.OutputEncoding = Encoding.Unicode; ใน. Net 4 ขึ้นไปจะได้รับอินฟินิตี้ที่จะแสดงเป็น throw แต่มี IOException ในรุ่นก่อนหน้า

หมายเหตุ: ฉันใช้งาน Visual Studio 2015 Community Edition บน Windows 10 64 บิต

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.