1

我有一个 UNICODE 字符串(中文),我想将其转换回 MBCS,以便将其作为参数添加到 SQL 查询中。(SQL Server 中的列在 varchar 中,所以这种转换对我来说是必要的)。

如何在 C# 中转换为 MBCS?请帮忙。

谢谢, 普拉塞奥

4

3 回答 3

2

“MBCS”可以是多种编码。对于中国语言环境,它将是代码页 936,一个 GB 变体,您可以使用以下方法对其字节进行编码:

byte[] bytes= Encoding.GetEncoding(936).GetBytes("你好")
=>
{196, 227, 186, 195}

如果您不是专门讨论 GB 编码并且想要任何多字节编码是您当前系统的默认值,那么您可以使用默认(“ANSI”)编码,即 MBCS 编码:

byte[] bytes= Encoding.Default.GetBytes("你好")
=>
{196, 227, 186, 195}  // on a system in the China locale (cp936)
{167, 65, 166, 110}   // on a system in the HK locale (cp950)

现在要将您的字节数组放入查询中,您必须:

1) 最好,使用带有基于字节的 SqlDbType 的参数,例如:

command.Parameters.AddWithValue("@greeting", bytes);

2)如果您必须将其直接插入查询字符串,请将字节编码为十六进制文字,例如:

"0x"+BitConverter.ToString(bytes).Replace("-", "")
=>
... WHERE greeting=0xC4E3BAC3 ...

(这是非 ANSI 标准的 SQL Server 语法)

于 2011-10-17T19:47:48.213 回答
0

感谢 bobince 的提示。我无法参数化我的查询执行。

最后,我的一位资深同事提供了帮助。:) 这是将 Unicode 编码字符串转换为由多字节字符 (MBCS) 组成的字符串的另一种解决方案,以便在 T-SQL 中与旧数据库中的 varchar 列进行比较。

我们可以使用SqlString 类的GetNonUnicodeBytes() 方法。

这是下面的代码片段。

        string inputUnicodeString = "你好";
        SqlString mySqlString = new SqlString(inputUnicodeString);
        byte[] mbcsBytes = mySqlString.GetNonUnicodeBytes();
        string outputMbcsString = string.Empty;
        for (int index = 0; index < mbcsBytes.Length; index++)
        {
            outputMbcsString += Convert.ToChar(mbcsBytes[index]);
        }

这有助于我将所需的 varchar 数据库列与 UNICODE 中用户请求的字符串进行比较。希望此回复对其他人有所帮助。

问候,

普拉塞奥

于 2011-10-22T16:01:54.463 回答
-1

我不确定你是否想要这个:

string result = Encoding.GetEncoding("gb2312").GetString(Encoding.Unicode.GetBytes(yourStr));
于 2011-10-17T05:52:57.767 回答