C# 使用字符编码转换为其他格式

C# 使用字符编码转换为其他格式,c#,character-encoding,oracle10g,C#,Character Encoding,Oracle10g,我正在使用oracle10g数据库作为C应用程序。问题是,在数据库中,NVARCHAR列不保存除英语以外的其他语言。由于NVARCHAR支持Unicode,这应该是可行的。但我尝试了一个简单的方法,使用教程如下: Encoding ascii = Encoding.ASCII; Encoding unicode = Encoding.Unicode; //Convert the string into a byte[]. byte[] unicodeBytes = ascii.GetBytes

我正在使用
oracle10g
数据库作为
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();
梅看起来很傻,但她希望我能用上面的格式在控制台应用程序中显示文本。现在它显示了问号。任何方式我都可以显示文本并至少以任何其他格式保存,这样我就可以在前端检索并适当地显示它。

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

如果我们遵守文档中明确说明的两个重要先决条件,Windows控制台可以处理unicode而不会出现任何问题:

对Unicode[…]的支持要求字体具有呈现该字符所需的字形。要在控制台上成功显示Unicode字符,必须将控制台字体设置为[…]字体,如ConsoleAS或Lucida console

这是您必须在Windows设置中确保的,独立于.NET应用程序

第二个先决条件,重点是:

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

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

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

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

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();
  • 打开windows注册表编辑器
  • 导航到HKLM\Software\Microsoft\WindowsNT\CurrentVersion\Console\TrueTypeFont
  • 创建一个新的字符串值,分配一个可用的键,如“000”和值“Bangla Medium”
  • 重新启动电脑
  • 现在使用控制台的窗口菜单,最后一个菜单项“Properties”,第二个选项卡“font”,将控制台字体设置为“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();
            }
        }
    }
    

    您正在将其转换回ASCII。把那部分去掉。如果ODP是问题所在,请指定驱动程序和版本,并包括与数据库相关的部分。当前,oracle10g标记将不适用。
    byte[]unicodeBytes=ascii.GetBytes(…)
    <这看起来是否可疑?ascii无法将该文本转换为字节。ASCII仅包含西欧拉丁字母、普通数字和一些标点符号和括号。你为什么还要尝试使用它呢?还要注意,没有像“unicode”这样的编码<编码>编码。Unicode实际上是UTF16-LE。。我从这个维基百科页面上收集到的信息,似乎是一种使用ASCII范围的代码点的编码,但它依赖于某种字体来显示孟加拉文。我们可能需要在孟加拉语和字符编码方面具有良好领域知识的人来正确回答这个问题,但我建议无论如何添加您的oracle数据提供程序特定代码,如果可以,请完全使用unicode!问题一点也不傻,字符集与html解析和时区是一个联盟。