使用字符编码转换为另一种格式

时间:2018-04-16 07:27:39

标签: c# character-encoding oracle10g

我正在为Oracle 10g应用程序使用C#数据库。问题是,在数据库中, NVARCHAR 列不会保存除英语之外的其他语言。由于 NVARCHAR 支持Unicode,因此应该可以正常工作。但相反,我尝试使用如下教程的简单方法:

Encoding ascii = Encoding.ASCII;
Encoding unicode = Encoding.Unicode;

//Convert the string into a byte[].
byte[] unicodeBytes = ascii.GetBytes("আমার সোনার বাংলা!"); //Text to show

//Perform the conversion from one encoding to the other.
byte[] asciiBytes = Encoding.Convert(ascii, unicode, unicodeBytes);
char[] asciiChars = new char[ascii.GetCharCount(asciiBytes, 0, asciiBytes.Length)];
ascii.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0);
string asciiString = new string(asciiChars);
Console.WriteLine(asciiString);

Console.ReadKey();

可能看起来很傻但是我希望能用上述格式在控制台应用中显示文字。现在它显示问题(??????)标记。我可以用任何方式显示文本并至少以任何其他格式保存,因此我可以在前端检索并正确显示它。

1 个答案:

答案 0 :(得分:1)

如果您可以使用unicode(并且您应该使用它的2018年),那么最好完全避免使用Bijoy。处理和存储字符串的所有内容,如.NET中的System.String和Oracle中的NVARCHAR

如果我们遵守文档明确指出的两个重要先决条件,Windows控制台可以毫无问题地处理unicode:

  

支持Unicode [...]需要具有呈现该字符所需的字形的字体。要成功将Unicode字符显示到控制台,控制台字体必须设置为[...]字体,如Consolas或Lucida控制台

这是您必须在Windows设置中确保的,与.NET应用程序无关。

第二个先决条件,强调我的:

  

[...] Console类支持UTF-8编码[...]从.NET Framework 4.5开始,Console类还支持UTF-16编码[...]向控制台显示Unicode字符。您将OutputEncoding属性设置为UTF8Encoding或UnicodeEncoding

文档没有说明,可以从控制台窗口的属性菜单中选择的字体通常都不包含世界上所有字母的字形。如果你需要从右到左的能力,例如希伯来语或阿拉伯语,你就不走运了。

如果程序运行的是没有预装东亚字体的Windows版本,请follow this tutorial安装Bangla LanguageInterfacePack(KB3180030)。

然后将this answer应用于我们的问题,如下所示:

  1. 打开Windows注册表编辑器
  2. 导航至HKLM \ Software \ Microsoft \ WindowsNT \ CurrentVersion \ Console \ TrueTypeFont
  3. 创建一个新的字符串值,分配一个可用的键,如“000”,以及值“Bangla Medium”
  4. 重新启动电脑
  5. 现在使用控制台的窗口菜单,最后一个菜单项“属性”,第二个选项卡“字体”将控制台字体设置为“Bangla”。

    最后来回摆脱所有编码,然后简单地写:

    using System;
    using System.Text;
    
    namespace so49851713
    {
        class Program
        {
            public static void Main()
            {
                var mbb = "\u263Aআমার সোনার বাংলা!";
                /* prepare console (once per process) */
                Console.OutputEncoding = UTF8Encoding.UTF8;
                Console.WriteLine(mbb);
                Console.ReadLine();
            }
        }
    }