为什么Console.Write对字符x266A的处理方式不同?

时间:2011-08-25 17:33:42

标签: c# .net unicode

我正在编写一个控制台应用程序,需要打印一些非典型的(用于控制台应用程序)unicode字符,如音符,方框图符号等。

大多数字符都正确显示,或显示?如果控制台使用的字体不存在字形,但我发现一个字符表现奇怪,可以通过下面的行演示:

Console.Write("ABC");
Console.Write('♪'); //This is the same as: Console.Write((char)0x266A);
Console.Write("XYZ");

当它运行时,它将打印ABC然后将光标移回到行的开头并用XYZ覆盖它。为什么会这样?

2 个答案:

答案 0 :(得分:5)

控制台不使用Uncode,因此必须将字符转换为8位代码页。 字符将转换为代码为13(十六进制0x0d)的字符,即CR或Carrage Return。

在大多数代码页中,例如code page 850,CR字符符字形类似于四分音符,而266a字符被指定为Unicode等效字符。

但是,如果将CR字符写入控制台,它将不会显示四分音符字形,而是将其解释为控制字符CR,它将光标移动到行的开头。

答案 1 :(得分:2)

Console.Write('♪');被视为Unicode。我的猜测是它将它转换为最接近的ASCII字符。您应该使用U+1D160或相应的unicode,音乐等效。

在Unicode代码集中生成音乐输出所需的基元(从U + 1D100开始)。例如,U + 1D11A是一个5行的工作人员,U + 1D158是一个封闭的符头。

请参阅http://www.unicode.org/charts/PDF/U1D100.pdf

..然后问题变得确保你有一个包含适当字形的字体(并处理正确间隔的问题等)。

如果您想要生成打印输出,您应该查看Lilypond,这是一个OSS音乐符号包,它使用文本文件格式来定义音乐内容,然后生成华丽的输出。