在开发一个简洁的控制台应用程序时,意识到需要一个能够仅显示文本的界面,没有任何图片或花哨的标志。寻找了现有的工具,但没有找到符合需求的。因此,决定自己创建一个项目,整合了不同部分的自由代码片段。如果下载了二进制分发版,请创建一个快捷方式链接到可执行文件,并更改字体为LUCIDA CONSOLE以查看Unicode字符。
其中一个令人惊讶的挑战是显示土耳其语Unicode字体。解决方案似乎是使用kernel32.dll API。将一组函数移动到Turkish.cs文件中,但真正需要的只是一个函数:这个函数可以在控制台窗口中显示Unicode字符,只要控制台的字体属性设置为TrueType字体,如Lucida Console字体。在Turkish.cs中添加了所有特殊的土耳其字符,这些字符不在常规ASCII中,使用的是ISO 8859-9到Unicode文档:
Small Letters
Capital Letters
c_with_cedilla
C_with_cedilla
g_with_breve
G_with_breve
i_without_dot
I_with_dot
o_with_diaeresis
O_with_diaeresis
s_with_cedilla
S_with_cedilla
u_with_diaeresis
U_with_diaeresis
控制台的字体属性可以通过点击控制台窗口左上角并选择"属性",然后选择"字体"标签来更改。只要它们是固定宽度字体,就可以向控制台添加更多字体。但Lucida足以显示所有土耳其字母。
Microsoft的System.Net和System.Xml.Linq是用于读取RSS XML页面和解析的简单易用的库。在RSS.cs文件中将相关的静态函数封装在RSS类中。RSS类有一个公共方法:
public static List GetRssFeeds(string[] rss_sites)
其中rss_sites是一个字符串数组,包含RSS源的URL地址。值得注意的是,当使用HttpWebRequest对象时,将其代理设置为null可以大大提高速度。有时RSS源中的"description"元素会包含一些不需要的其他XML元素。为了剥离这些元素,使用了StripTagsCharArray函数。
不喜欢系统自动定位控制台窗口的方式。通过点击控制台窗口左上角并选择属性,然后选择"布局"来调整规格以满足喜好。运行应用程序会返回一份土耳其经济新闻列表,这些新闻来自土耳其报纸。这使得控制台窗口变得拥挤,所以限制了输出到10行新闻,使用RSS.cs中的常量MAX_NEWS。如果按下回车键足够多次,将看到CNN世界新闻。
尝试使program.cs尽可能简单:
static void Main(string[] args)
{
string[] rssFeeds = { "http://rss.hurriyet.com.tr/rss.aspx?sectionId=4", "http://rss.cnn.com/rss/cnn_world.rss" };
List news = Rss.GetRssFeeds(rssFeeds);
foreach (var item in news)
{
Console.WriteLine(item);
}
}
它返回的正是在开始工作之前所希望找到的:一个简洁的控制台RSS阅读器。
当尝试在干净的环境中测试exe的发布版本时,很快就发现让用户手动更改控制台属性是多么烦人。如何自动更改控制台字体?这个问题被提出,并尝试使用未记录的kernel32调用来回答。因此,将有趣的函数原型整合到这个项目中,但最终没有使用它们,因为它们并没有真正达到想要的效果。还有一种方法可以通过注册表更改控制台的字体,但不喜欢这个解决方案。
早些时候,尝试使用快捷方式链接并使用环境变量%CD%从那里更改字体,但快捷方式属性的工作目录不会接受它。尝试脚本创建快捷方式链接,但API似乎不支持更改字体。这就是为什么不能在这个包中包含快捷方式链接。如果希望在控制台中保持Lucida字体设置,请创建一个快捷方式链接,并在其属性中更改字体为Lucida。然后每次双击快捷方式,而不是主MyCSrss.exe,将看到土耳其字体。