从 .NET Framework 4.5 开始,Console 类支持与 UnicodeEncoding 类的 UTF-16 编码。  显示 Unicode 字符到控制台,你可以设置 OutputEncoding 属性为 UTF8EncodingUnicodeEncoding

下面的示例显示 Unicode 字符的范围到控制台中。  该示例接受三个命令行参数:显示范围的开头,显示范围的末尾,以及是否使用当前控制台编码 (false) 或 UTF-16 编码 (true)。  假定控制台使用一个 TrueType 字体。

  1. class Program
  2. {
  3. private static void Main(string[] args)
  4. {
  5. uint rangeStart = ;
  6. uint rangeEnd = ;
  7. bool setOutputEncodingToUnicode = true;
  8. // Get the current encoding so we can restore it.
  9. Encoding originalOutputEncoding = Console.OutputEncoding;
  10.  
  11. try
  12. {
  13. switch (args.Length)
  14. {
  15. case :
  16. rangeStart = uint.Parse(args[], NumberStyles.HexNumber);
  17. rangeEnd = uint.Parse(args[], NumberStyles.HexNumber);
  18. setOutputEncodingToUnicode = true;
  19. break;
  20. case :
  21. if (!uint.TryParse(args[], NumberStyles.HexNumber, null, out rangeStart))
  22. throw new ArgumentException(String.Format("{0} is not a valid hexadecimal number.", args[]));
  23.  
  24. if (!uint.TryParse(args[], NumberStyles.HexNumber, null, out rangeEnd))
  25. throw new ArgumentException(String.Format("{0} is not a valid hexadecimal number.", args[]));
  26.  
  27. bool.TryParse(args[], out setOutputEncodingToUnicode);
  28. break;
  29. default:
  30. Console.WriteLine("Usage: {0} <{1}> <{2}> [{3}]",
  31. Environment.GetCommandLineArgs()[],
  32. "startingCodePointInHex",
  33. "endingCodePointInHex",
  34. "<setOutputEncodingToUnicode?{true|false, default:false}>");
  35. return;
  36. }
  37.  
  38. if (setOutputEncodingToUnicode)
  39. {
  40. // This won't work before .NET Framework 4.5.
  41. try
  42. {
  43. // Set encoding using endianness of this system.
  44. // We're interested in displaying individual Char objects, so
  45. // we don't want a Unicode BOM or exceptions to be thrown on
  46. // invalid Char values.
  47. Console.OutputEncoding = new UnicodeEncoding(!BitConverter.IsLittleEndian, false);
  48. Console.WriteLine("\nOutput encoding set to UTF-16");
  49. }
  50. catch (IOException)
  51. {
  52. Console.OutputEncoding = new UTF8Encoding();
  53. Console.WriteLine("Output encoding set to UTF-8");
  54. }
  55. }
  56. else
  57. {
  58. Console.WriteLine("The console encoding is {0} (code page {1})",
  59. Console.OutputEncoding.EncodingName,
  60. Console.OutputEncoding.CodePage);
  61. }
  62. DisplayRange(rangeStart, rangeEnd);
  63. }
  64. catch (ArgumentException ex)
  65. {
  66. Console.WriteLine(ex.Message);
  67. }
  68. finally
  69. {
  70. // Restore console environment.
  71. Console.OutputEncoding = originalOutputEncoding;
  72. }
  73. }
  74.  
  75. public static void DisplayRange(uint start, uint end)
  76. {
  77. const uint upperRange = 0x10FFFF;
  78. const uint surrogateStart = 0xD800;
  79. const uint surrogateEnd = 0xDFFF;
  80.  
  81. if (end <= start)
  82. {
  83. uint t = start;
  84. start = end;
  85. end = t;
  86. }
  87.  
  88. // Check whether the start or end range is outside of last plane.
  89. if (start > upperRange)
  90. throw new ArgumentException(String.Format("0x{0:X5} is outside the upper range of Unicode code points (0x{1:X5})",
  91. start, upperRange));
  92. if (end > upperRange)
  93. throw new ArgumentException(String.Format("0x{0:X5} is outside the upper range of Unicode code points (0x{0:X5})",
  94. end, upperRange));
  95.  
  96. // Since we're using 21-bit code points, we can't use U+D800 to U+DFFF.
  97. if ((start < surrogateStart & end > surrogateStart) || (start >= surrogateStart & start <= surrogateEnd))
  98. throw new ArgumentException(String.Format("0x{0:X5}-0x{1:X5} includes the surrogate pair range 0x{2:X5}-0x{3:X5}",
  99. start, end, surrogateStart, surrogateEnd));
  100. uint last = RoundUpToMultipleOf(0x10, end);
  101. uint first = RoundDownToMultipleOf(0x10, start);
  102.  
  103. uint rows = (last - first) / 0x10;
  104.  
  105. for (uint r = ; r < rows; ++r)
  106. {
  107. // Display the row header.
  108. Console.Write("{0:x5} ", first + 0x10 * r);
  109.  
  110. for (uint c = ; c < 0x10; ++c)
  111. {
  112. uint cur = (first + 0x10 * r + c);
  113. if (cur < start)
  114. {
  115. Console.Write(" {0} ", Convert.ToChar(0x20));
  116. }
  117. else if (end < cur)
  118. {
  119. Console.Write(" {0} ", Convert.ToChar(0x20));
  120. }
  121. else
  122. {
  123. // the cast to int is safe, since we know that val <= upperRange.
  124. String chars = Char.ConvertFromUtf32((int)cur);
  125. // Display a space for code points that are not valid characters.
  126. if (CharUnicodeInfo.GetUnicodeCategory(chars[]) ==
  127. UnicodeCategory.OtherNotAssigned)
  128. Console.Write(" {0} ", Convert.ToChar(0x20));
  129. // Display a space for code points in the private use area.
  130. else if (CharUnicodeInfo.GetUnicodeCategory(chars[]) ==
  131. UnicodeCategory.PrivateUse)
  132. Console.Write(" {0} ", Convert.ToChar(0x20));
  133. // Is surrogate pair a valid character?
  134. // Note that the console will interpret the high and low surrogate
  135. // as separate (and unrecognizable) characters.
  136. else if (chars.Length > && CharUnicodeInfo.GetUnicodeCategory(chars, ) ==
  137. UnicodeCategory.OtherNotAssigned)
  138. Console.Write(" {0} ", Convert.ToChar(0x20));
  139. else
  140. Console.Write(" {0} ", chars);
  141. }
  142.  
  143. switch (c)
  144. {
  145. case :
  146. case :
  147. Console.Write("-");
  148. break;
  149. case :
  150. Console.Write("--");
  151. break;
  152. }
  153. }
  154.  
  155. Console.WriteLine();
  156. if ( < r && r % 0x10 == )
  157. Console.WriteLine();
  158. }
  159. }
  160.  
  161. private static uint RoundUpToMultipleOf(uint b, uint u)
  162. {
  163. return RoundDownToMultipleOf(b, u) + b;
  164. }
  165.  
  166. private static uint RoundDownToMultipleOf(uint b, uint u)
  167. {
  168. return u - (u % b);
  169. }
  170.  
  171. }

演示结果

NET Framework 4.5新特性 (二) 控制台支持 Unicode (UTF-16) 编码的更多相关文章

  1. 精进不休 .NET 4.5 (12) - ADO.NET Entity Framework 6.0 新特性, WCF Data Services 5.6 新特性

    [索引页][源码下载] 精进不休 .NET 4.5 (12) - ADO.NET Entity Framework 6.0 新特性, WCF Data Services 5.6 新特性 作者:weba ...

  2. .Net Framework 各个版本新特性总结 (一)

    .Net Framework 4.5 新特性 最近面试时又看到有问.Net Framework 新特性的问题,一时被问到了.平时也是拿起来就用,新版本出来了,新特性也就是瞄一眼,也没去仔细查看.这次干 ...

  3. NET Framework 4.5新特性 数据库的连接加密保护。

    NET Framework 4.5新特性 (一) 数据库的连接加密保护. NET Framework 4.5 ado.net数据库连接支持使用SecureString内存流方式保密文本.  一旦使用这 ...

  4. NET Framework 4.5新特性 (一) 数据库的连接加密保护。

    NET Framework 4.5 ado.net数据库连接支持使用SecureString内存流方式保密文本.  一旦使用这类操作,文本加密是私有不能共享的,并在不再需要时从计算机内存中删除.  S ...

  5. atitit.js 各版本 and 新特性跟浏览器支持报告

    atitit.js 各版本 and 新特性跟浏览器支持报告 一个完整的JavaScript实现是由以下3个不同部分组成的 •核心(ECMAScript)--JavaScript的核心ECMAScrip ...

  6. ECMAScript 5和ECMAScript6的新特性以及浏览器支持情况

    ECMAScript简介: 它是一种由Ecma国际(前身为欧洲计算机制造商协会)制定和发布的脚本语言规范,javascript在它基础上经行了自己的封装.但通常来说,术语ECMAScript和java ...

  7. ECMAScript和JavaScript的区别,ECMAScript发展更新历史,ECMAScript5和ECMAScript6的新特性及浏览器支持情况,ECMAScript 5/ECMAScript 2015正式发布

    ECMAScript和JavaScript的区别 ECMA是European Computer Manufacturers Association的缩写,即欧洲计算机制造商协会.欧洲计算机制造商协会是 ...

  8. .NET Framework 4.5新特性

    前言 .Net FrameWrok的每个版本都要他的新特性的加入,比如,NET1.1中的委托,NET2.0中的泛型,NET3.0中的Linq,.NET4.0中的动态类型,那么.NET Framewor ...

  9. framework各版本新特性(为面试准备)

    菜鸟D估计描述这些新特性的文章都是烂大街的货色,之所以拿出来分(e)享(xin)一下,有两个原因:1.当年面试的时候有人问到,我不知道该怎么回答:2.项目需要发布了,但是考虑到framework的版本 ...

随机推荐

  1. NPOI(2.1.3)向excel中插入图片,xls文档图片插入成功,xlsx文档图片插入失败

    众所周知,NPOI对xls和xlsx两个版本的excel文档的操作并没有一个统一的支持, 程序若想兼容这两个版本的操作,必须根据excel版本分别去调用HSSF和XSSF这两套操作库, 之前一直不明白 ...

  2. 关于Tomcat 开启不了的几点解释

    这段时间基本熟悉java语言基本语法包,类(内部,外部),整体结构跟c#还是有点差异,在接口,多态,抽象等几乎一致,唯一差异仅存在于关键字上. 在用了几天记事本熟悉代码上,昨天晚上就准备转想myEcl ...

  3. Atitit. http 代理原理  atiHttpProxy  大木马

    Atitit. http 代理原理  atiHttpProxy  大木马 1. 面这张图可以清晰地阐明HttpProxy的实现原理:1 2. 代理服务器用途1 3. 其中流程具体如下:2 4. 设计规 ...

  4. Atitit.有分区情况下的表查询策略流程

    Atitit.有分区情况下的表查询策略流程 1. 分区表查询策略流程1 2. 常见数据库oracle mysql的分区查询语句1 2.1. 跨分区查询(oracle)1 2.2. 单分区查询 (ora ...

  5. Yii2数据库查询语法

    一: $con = Yii::$app->db; $rel = $con->createCommand("select * from user");//预处理对象 $r ...

  6. tomcat打印GC日志

    在catinlin.sh的最上面加上 JAVA_OPTS=" -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/lnmp/tomcat8 ...

  7. string.erase()--已解决

    在代码中需要实现这样一个功能,需要将[00000001]这个存储在string中的字符串的中括号去掉,首先想到的就是string.erase()这个函数.结果... 代码: #include < ...

  8. 利用JMX统计远程JAVA进程的CPU和Memory

    http://songzi0206.iteye.com/blog/1541636 ******************** 从JAVA 5开始,JDK提供了一些JVM检测的API,这就是有名的java ...

  9. qt中执行 sql文件的方法

    由于qt中没有原生的执行sql文件的方法.因此我们需要根据sql文件中的流的特点,将其分解成一个个语句单独执行. 1.首先通过Qfile读取sql文件 2.将sql文件中的内容通过“:”进行拆解 3. ...

  10. url参数

    两个参数情况: String url="http://59.78.93.208:9097/Order?id="+id+"&value="+value; ...