最近有个小项目需要用到韩语显示,在WinForm中始终显示的是乱码
主要程序如下:
var content = File.ReadAllLines(@"..\..\ekdic.txt"); for (int i = 0; i < 10; i++) { textBox1.Text+=content[i]+'\n'; }
其中的ekdic.txt是一个英韩的小词典,只读取了其中10行.去网上查资料,MSDN上翻也没找到解决办法,后来无意中在查看File.ReadAllLines方法时看到它还有其它的重载
// // 摘要: // 打开一个文件,使用指定的编码读取文件的所有行,然后关闭该文件。 // // 参数: // path: // 要打开以进行读取的文件。 // // encoding: // 应用到文件内容的编码。 // // 返回结果: // 包含文件所有行的字符串数组。 // // 异常: // System.ArgumentException: // path 是一个零长度字符串,仅包含空白或者包含一个或多个由 System.IO.Path.InvalidPathChars 定义的无效字符。 // // System.ArgumentNullException: // path 为 null。 // // System.IO.PathTooLongException: // 指定的路径、文件名或者两者都超出了系统定义的最大长度。例如,在基于 Windows 的平台上,路径必须小于 248 个字符,文件名必须小于 260 // 个字符。 // // System.IO.DirectoryNotFoundException: // 指定的路径无效(例如,它位于未映射的驱动器上)。 // // System.IO.IOException: // 打开文件时发生了 I/O 错误。 // // System.UnauthorizedAccessException: // path 指定了一个只读文件。- 或 -在当前平台上不支持此操作。- 或 -path 指定了一个目录。- 或 -调用方没有所要求的权限。 // // System.IO.FileNotFoundException: // 未找到 path 中指定的文件。 // // System.NotSupportedException: // path 的格式无效。 // // System.Security.SecurityException: // 调用方没有所要求的权限。 [SecuritySafeCritical] public static string[] ReadAllLines(string path, Encoding encoding);
仔细想了一下,ReadLines(string path)中默认的编码是你计算机上本地的编码(中文),自然不会是韩国语,读取出来就牛头不对马嘴,想起以前看过的编码转换,使用上一篇文章中的korean(代码页949)编码来读取这个英韩词典,哈哈,成功读取并显示:
var korea = Encoding.GetEncoding("ks_c_5601-1987"); //或者直接使用其代码 //var korea = Encoding.GetEncoding(949); var content = File.ReadAllLines(@"..\..\ekdic.txt",korea); for (int i = 0; i < 10; i++) { textBox1.Text+=content[i]+'\n'; }
通过手动指定编码(encoding)就可以显示出正确的韩语了(其它编码形式的韩国语文件可以通过改变encoding来读取,请参阅上一篇文章中的代码页)
如果以后想显示日文,想来道理也是一样,使用日文的编码来读取文件再显示就OK
对英韩,韩英词典感兴趣的朋友们可以在下面的地址找到(TXT开源格式哟)
http://bbs.pdafans.com/viewthread.php?tid=80159&page=1
在WinForm中显示日文应该也是一样的道理,待验证...