我有一个UNICODE字符串(中文),我想转换回MBCS,以便将其作为参数添加到SQL查询。(列在SQL Server在varchar,所以这种转换是必要的我)。
如何在c#中转换为MBCS ?请帮助。
谢谢,Praseo
" 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语法)
感谢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字符串。希望这个回复能帮助别人。
问候,
Praseo
我不确定你是否想要这个:
string result = Encoding.GetEncoding("gb2312").GetString(Encoding.Unicode.GetBytes(yourStr));