Tại sao vô cực được in như là 8 8 trong bảng điều khiển Windows 10?


146

Tôi đã kiểm tra những gì được trả về từ phép chia, bao gồm cả số 0 0/1, 1/00/0. Đối với điều này, tôi đã sử dụng một cái gì đó tương tự như sau:

Console.WriteLine(1d / 0d);

Tuy nhiên mã này in 8không Infinityhoặc một số chuỗi khác không đổi PositiveInfinity.

Để hoàn thiện tất cả các bản in sau 8:

Console.WriteLine(1d / 0d);

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

Console.WriteLine(Double.PositiveInfinity);

Console.WriteLine(Double.NegativeInfinity);in -8.

Tại sao vô cực này in 8?


Đối với những người bạn dường như nghĩ rằng đây là một biểu tượng vô cực không phải là tám chương trình sau đây:

Console.WriteLine(1d / 0d);

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

Console.WriteLine(Double.PositiveInfinity);

Console.WriteLine(8);

Đầu ra:

Sản lượng không rõ ràng


69
Bạn thấy là dấu hiệu của vô cùng. chỉ cần lật 90 độ để thấy nó 8
Mohit Shrivastava

23
Bạn có chắc chắn đó là một 8ký tự Unicode thực tế , không phải là một số ký tự lạ cho vô cực, xoay 90 độ? Điều này có thể thay đổi dựa trên miền địa phương của bạn. Tôi đã thử nó trên dotnetfiddle.net và nó được in Infinity.
Kroltan

4
@TheLethalCoder Vui lòng làm những gì Sinatr đề xuất hoặc in đầu ra của Double.PositiveInfinity.ToString()[0] == '8'. Có một số nhân vật kỳ lạ trông rất giống với những người khác trong một số phông chữ. Ngoài ra, máy tính của bạn được cấu hình theo ngôn ngữ nào?
Kroltan

15
Đây dường như là một vấn đề của Windows 10. Trong Windows 8.1 tôi đã có một biểu tượng vô cực. Đã nâng cấp vài ngày trước lên Windows 10 và bây giờ tôi cũng có một 8(ngôn ngữ tiếng Đức).
René Vogt

13
Kiểm tra nhanh sẽ là xem điều gì sẽ xảy raConsole.Write("∞");
Jon Hanna

Câu trả lời:


110

Hãy yên tâm rằng giá trị của dấu phẩy động là +Infinitynếu tử số của phép chia điểm trôi nổi bằng 0, -Infinitynếu tử số của phép chia dấu phẩy động bằng 0 là âm và NaNnếu tử số và mẫu số của phép chia điểm nổi đều bằng 0. Đó là trong đặc tả điểm nổi của IEEE754 , đó là những gì C # sử dụng.

Trong trường hợp của bạn, bảng điều khiển đang chuyển đổi biểu tượng vô cực (đôi khi được biểu thị theo kiểu chữ là 8 ngang) thành 8 dọc.


13
@TheLethalCoder Hình ảnh không từ chối câu trả lời này, vì đó là hình ảnh của bảng điều khiển của bạn
Rob

9
@Rob Tôi đã đọc sai câu trả lời, tuy nhiên điều đó đặt ra câu hỏi, tại sao nó lại chuyển đổi nó thành số 8? Và tại sao một số câu đố / bảng điều khiển in chuỗi ký tự
TheLethalCoder

1
Đây có vẻ là trường hợp sử dụng trình gỡ lỗi Tôi thấy biểu tượng vô cực (tức là ngang 8), có lý do gì bảng điều khiển của tôi chuyển đổi thành 8 trong khi mọi người khác dường như sử dụng Infinityhoặc tương tự ngay cả khi tôi sử dụng mã từ câu trả lời bởi Soren bằng cách chỉ định văn hóa
TheLethalCoder

4
Nó được gọi là "lemniscate". Nó có giá trị unicode:
BlueRaja - Danny Pflughoeft

14
Điều này có lẽ giải thích tại sao Buzz Lightyear nói "To Eight And Beyond!" khi tôi chơi Toy Story trên PC. ;)
DeanOC

70

Đưa ra một số cài đặt nhất định (nghĩa là kết hợp các nền văn hóa, mã hóa đầu ra, v.v.) .NET sẽ xuất ký tự vô cực Unicode (/ & # 8734;). Trình giả lập bảng điều khiển / thiết bị đầu cuối Windows 10 sẽ (một lần nữa đưa ra một số cài đặt nhất định - xem ảnh chụp màn hình bên dưới) hiển thị ký tự Unicode này dưới dạng 8.

Ví dụ: trên Windows 10, với các cài đặt bên dưới (lưu ý trang mã) chỉ cần dán vào bảng điều khiển hiển thị là 8.

Cài đặt để tái tạo

BIÊN TẬP

Cảm ơn lời nhận xét từ Chris : Dường như phông chữ đầu ra kết hợp với trang mã chịu trách nhiệm cho vấn đề ∞ => 8 trên bảng điều khiển. Giống như anh ấy, tôi có hiển thị đúng trong tất cả các phông chữ TrueType mà tôi đã thử và chỉ thấy 8 khi phông chữ raster 'được chọn.

cài đặt phông chữ


1
Của tôi thực sự hiển thị dấu vô cực ở bên cạnh thay vì "8" khi dán trong bảng điều khiển, mặc dù tôi đang sử dụng "437 (OEM - Hoa Kỳ)"
Derek 會

3
Mặc dù câu trả lời là đúng nhưng một số cài đặt có thể gây ra sự cố hiển thị này, nửa sau không chính xác. Các tùy chọn của tôi hiện tại trông giống hệt như ở trên và tôi nhận được đúng thay vì 8. Tôi chỉ có thể hiển thị số 8 nếu tôi truy cập trang phông chữ và chọn "phông chữ raster" từ danh sách phông chữ có sẵn. Consolas, Courier New và những người khác dường như đều hiển thị tốt ...
Chris

Đây chắc chắn là sự kết hợp của hai yếu tố, bởi vì đặt phông chữ thành Raster khi bảng mã là 437 vẫn hiển thị chính xác biểu tượng. Chỉ khi cả hai điều kiện được đáp ứng thì điều này dường như xảy ra (ít nhất là đối với tôi).
Moshe Katz

39

Các 8biểu tượng xảy ra khi Windows chuyển đổi Unicode để một mã hóa ký tự di sản. Do không có biểu tượng vô cực trong mã hóa kế thừa, nên theo mặc định , nó sử dụng "phù hợp nhất" với biểu tượng đó, trong trường hợp này là số 8. Xem ví dụ về mã hóa "windows-1252" của Microsoft . Rõ ràng, Windows 10 vẫn sử dụng mã hóa ký tự cũ theo mặc định trong bảng điều khiển (xem "Trang mã" ).


11
Tôi tự hỏi tại sao "8" được coi là phù hợp, khi nó có ý nghĩa về mặt ngữ nghĩa để tạo ra sự nhầm lẫn? Các ký tự khác trong trang mã 437 có vẻ phù hợp hơn, như ký hiệu độ hoặc ký hiệu trên mỗi mille (một% có hai chữ o dưới dấu gạch chéo). Không ai trong số họ sẽ tốt như một dấu hiệu vô cực thực sự, nhưng họ dường như ít gây ra nhầm lẫn.
supercat

"Rõ ràng, Windows 10 vẫn sử dụng mã hóa ký tự kế thừa theo mặc định trong bảng điều khiển" Không, Windows 10 cmd.exe của tôi đã tắt mã hóa kế thừa.
Các cuộc đua nhẹ nhàng trong quỹ đạo

Đây là câu trả lời tốt nhất IMHO. Trên thực tế, bạn cũng có thể thấy ký tự '8' ở vị trí 0x2440 ít nhất trên hộp Windows 10 của tôi trong tệp c: \ windows \ system32 \ c_1252.nls ( vô cực là 0x221E và tệp có một số tiêu đề giải thích phần bù) . Tất cả mã hóa codepage có tệp .nls tương ứng. Theo mặc định, bảng điều khiển sử dụng trang mã 1252 (Windows 1252). Lưu ý những ánh xạ sẽ không được duy trì, kiểm tra này: blogs.msdn.microsoft.com/shawnste/2007/09/24/...
Simon Mourier

35

Lưu ý: Cuộc .ToString()gọi phương thức ngầm khi ghi Double.PositiveInfinityvào bàn điều khiển chịu trách nhiệm cho hành vi này.

Gọi điện thoại Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("en-Us")));

kết quả trong chuỗi "Vô cực"

trong khi Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("fr-Fr"))); kết quả là "+ Infini".

Chỉnh sửa: Như những người khác đã chỉ ra trong các commets, họ hoàn toàn không thể xác nhận kết quả của tôi. Thử nghiệm điều này trên một máy khác, tôi nhận được ký tự cho cả hai cuộc gọi.

Đầu ra cho tất cả các nền văn hóa , nhờ vtortola trong các ý kiến.


Tôi tìm thấy một câu trả lời (có khả năng):

Sử dụng Console.OutputEncoding = Encoding.Unicode;Tôi có thể tạo lại hành vi bạn đang gặp phải đối với một số nền văn hóa, ví dụ "ru", "ru-RU" tạo ra đầu ra 8.


1
Không thích thú, tôi đã thử các ví dụ của bạn và cả hai đều in 8
TheLethalCoder

1
@TheLethalCoder Tôi nhận được Infinitycả hai. Đó là văn hóa mà ứng dụng của bạn đang chạy? Kiểm tra Thread.CurrentThread.CurrentCultureThread.CurrentThread.CurrentUICulture.
vtortola

8
@ Søren D. Ptæus tbh Tôi không thể thấy bất kỳ nền văn hóa nào tạo ra 8 dotnetfiddle.net/QYhXMu
vtortola

1
Bạn nói đúng về ẩn ý .ToString(). Cuối cùng, ToString()sẽ trả lại .PositiveInfinitySymbolcủa có liên quan NumberFormatInfo. Chúng dường như phụ thuộc vào phiên bản thời gian chạy và / hoặc phiên bản Windows (hoặc bất kỳ hệ điều hành nào). Ngày xưa, CultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbolsẽ bằng "Infinity", nhưng với các phiên bản mới hơn của thời gian chạy và hệ điều hành thì "∞"thay vào đó. Tôi chỉ hỏi về nó trong một bình luận cho câu trả lời của Hans Passant trong chủ đề này.
Jeppe Stig Nielsen

16

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

Mã trang 1252 là một tai nạn khá phổ biến ở Anh vì đây là trang mã Windows mặc định ở đó. Vì nó dành cho Tây Âu và Châu Mỹ. Rất nhiều lý do để thay đổi thuộc tính Console.OutputEncoding mặc định theo chương trình, nhiều tệp văn bản sẽ được mã hóa vào năm 1252. Hoặc từ dòng lệnh bằng cách nhập chcp 1252(chcp == thay đổi trang mã) trước khi bắt đầu chương trình.

Như bạn có thể biết từ bộ ký tự được hỗ trợ bởi 1252, biểu tượng Infinity không khả dụng. Vì vậy, Encoding phải đưa ra một sự thay thế. Đó thường là ?glyph cho các điểm mã Unicode không được hỗ trợ, giá trị thuộc tính Encoding.EncoderFallback cho mã hóa 8 bit. Nhưng đối với năm 1252, và các trang mã MS-Dos 850 và 858 cũ, lập trình viên Microsoft đã quyết định 8. Anh chàng vui tính.

Glyph được hỗ trợ trong trang mã thông thường cho các ứng dụng bảng điều khiển trên máy phương Tây. Đó là 437, phù hợp với bộ ký tự IBM kế thừa . Có những thảm họa mã hóa là lý do tại sao Unicode được phát minh. Đáng buồn là quá muộn để giải cứu các ứng dụng bảng điều khiển, quá nhiều mã xung quanh dựa trên trang mã MS-Dos mặc định.

Việc Double.PositiveInfinity được chuyển đổi thành "" là dành riêng cho Win10. Nó từng là "Vô cực" trong các phiên bản Windows trước. Các loại định dạng này thường có thể được sửa đổi với Bảng điều khiển> Ngôn ngữ> Thay đổi định dạng ngày, giờ hoặc số> Nút Cài đặt bổ sung nhưng lựa chọn biểu tượng vô cực không được bao gồm trong hộp thoại. Cũng không được bao phủ bởi cơ quan đăng ký (HKCU \ Control Panel \ International), thay vào đó là một sự giám sát lớn. Đó là LOCALEClickOSINFINITY trong winapi bản địa. Trong một chương trình .NET, bạn có thể ghi đè lên chương trình bằng cách nhân bản CultureInfo và thay đổi thuộc tính NumberFormatInfo.PositiveInfinitySymbol của nó. Như thế này:

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

Mã của bạn cho phép tôi xác nhận WinXP sử dụng trang mã 437, trong Windows 10, hiện in ýthay vì . Nó cũng cho tôi thấy rằng sử dụng phông chữ không raster sẽ tránh được vấn đề.
Đánh dấu

Đây có phải là phiên bản của thời gian chạy .NET hay phiên bản Windows (hoặc bất kỳ HĐH nào) hoặc kết hợp, xác định xem có CultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbolcho "Infinity"hay "∞"(hoặc cái gì khác) không? Bạn nói ở trên rằng nó dành riêng cho Windows 10 và tôi đồng ý rằng nó đã được thay đổi vào một lúc nào đó. Nhưng nếu tôi chạy một ứng dụng trên Windows 8 với phiên bản "cùng" của .NET Framework , tôi sẽ nhận được kết quả khác với Windows 10 chứ?
Jeppe Stig Nielsen

Vấn đề này bắt đầu với Windows, sau đó phơi bày một vấn đề trong .NET. Win8 vẫn ủng hộ "Vô cực"
Hans Passant

1
Đã xác nhận! Tôi vừa đăng nhập vào máy Windows Server 2012 R2 (tương ứng với Windows 8.1) và tôi biết nó có .NET Framework mới nhất và nó cũng có Windows PowerShell mới nhất. Trong PowerShell, $PSVersionTabletiết lộ phiên bản PS là một cái gì đó với 5.1. PowerShell đó nhắm đến phiên bản .NET Framework (CLR) 4. * mà tôi biết là mới trên máy đó. Vẫn [cultureinfo]::GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymboltừ Windows PowerShell cung cấp Infinity, không (văn hóa hiện tại là en-US). Kết luận: Phiên bản Windows quyết định, không phải phiên bản .NET.
Jeppe Stig Nielsen

0

"8" cho vô cực được hiển thị trong bảng điều khiển khi chạy .Net 4 trở lên, nếu không các phiên bản trước hiển thị "Vô cực".

Sử dụng Console.OutputEncoding = Encoding.Unicode; trong .Net 4 trở lên sẽ có vô số để hiển thị dưới dạng, nhưng ném IOException trong các phiên bản trước.

LƯU Ý: Tôi đang chạy Visual Studio 2015 Community Edition trên Windows 10 64-bit

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.