使用C#将UCS-2字符转换为UTF-8

时间:2010-12-29 15:04:04

标签: c# unicode

我从MS SQL Server 2005数据库中提取一些国际化文本。根据该DB的默认值,字符存储为UCS-2。但是,我需要以UTF-8格式输出数据,因为我是通过网络发送的。目前,我有以下代码进行转换:

SqlString dbString = resultReader.GetSqlString(0);
byte[] dbBytes = dbString.GetUnicodeBytes();
byte[] utf8Bytes = System.Text.Encoding.Convert(System.Text.Encoding.Unicode, 
    System.Text.Encoding.UTF8, dbBytes);
System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding();
string outputString = encoder.GetString(utf8Bytes);

然而,当我在浏览器中检查输出时,无论我将编码设置为什么,它似乎都是垃圾。

我错过了什么?

编辑: 在回答下面的答案时,我认为我必须执行转换的原因是因为我可以输出文字多字节字符串就好了。例如:

OutputControl.Text = "カルフォルニア工科大学とチューリッヒ工科大学は共同で、太陽光を保管可能な燃料に直接変えることのできる装置の開発に成功したとのこと";

的工作原理。这里,OutputControl是ASP.Net Literal。但是,

OutputControl.Text = outputString; //Output from above snippet
如上所述,

导致输出错误。我的假设是数据库的输出以某种方式被ASP.Net破坏了。如果情况并非如此,那么还有什么其他可能性呢?

编辑2: 好的,我很蠢。事实证明,数据库完全没有问题。当我尝试插入自己的文字双字节字符(材料,原料;木料)时,即使没有任何转换过程,我也可以读取并输出它们。在我看来,无论是将数据插入数据库,都会以某种方式破坏字符,所以我要看一下。使用经过验证的“干净”数据,以下代码可以正常运行:

OutputControl.Text = dbString.ToString();

如下面的回答表明它应该。

2 个答案:

答案 0 :(得分:4)

您的代码基本上与以下内容相同:

SqlString dbString = resultReader.GetSqlString(0);
string outputString = dbString.ToString();

string本身是一个UNICODE字符串(具体来说,UTF-16,它几乎与UCS-2相同,除了代码点不适合最低16位)。换句话说,您正在执行的转换是多余的。

您的网络应用程序很可能在其他地方破坏编码,或者为HTML输出设置错误的编码。但是,无法根据您目前提供的信息进行诊断。

答案 1 :(得分:0)

.net中的

String 是'编码不可知'。

您可以使用特定的编码将 bytes 转换为 string ,告诉.net如何解释您的字节。

您可以使用特定编码将 string 转换为 bytes ,以告诉.net您希望如何提供字节。

但是尝试使用编码将字符串转换为另一个字符串根本没有任何意义。