如何把一个字符串转换成Unicode字符串,同时,如何转回来

duck_z 2005-04-09 10:02:38
我的目的,比如,如何吧“管理员”三个字转换成Unicode,存到数据库中,然后,从数据库中去出来的时候再转换回来,显示在界面中,谢谢
...全文
351 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
涛声宜旧 2005-04-22
  • 打赏
  • 举报
回复
写一个方法:
public static string Encrypt3DES(string a_strString, string a_strKey) //加密
{
string a_strString = "管理员";
TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider(); //选择对称加密算法
MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider(); //哈希值

DES.Key = hashMD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes.GetBytes(a_strKey)); //获取密钥(给定字符串的ASC码的哈希值做为密钥)
//DES.IV = hashMD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes.GetBytes(a_strKey));

DES.Mode = CipherMode.ECB; //获取密码模式

ICryptoTransform DESEncrypt = DES.CreateEncryptor();

byte[] Buffer = ASCIIEncoding.ASCII.GetBytes(a_strString);
return Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
}
freehul 2005-04-14
  • 打赏
  • 举报
回复
UTF-8转换函数

void ConvertGBKToUtf8(CString& strGBK)
{
int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);
unsigned short * wszUtf8 = new unsigned short[len+1];
memset(wszUtf8, 0, len * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, wszUtf8, len);

len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL);
char *szUtf8=new char[len + 1];
memset(szUtf8, 0, len + 1);
WideCharToMultiByte (CP_UTF8, 0, wszUtf8, -1, szUtf8, len, NULL,NULL);

strGBK = szUtf8;
delete[] szUtf8;
delete[] wszUtf8;

return;
}

void ConvertUtf8ToGBK(CString& strUtf8)
{
int len=MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL,0);
unsigned short * wszGBK = new unsigned short[len+1];
memset(wszGBK, 0, len * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, wszGBK, len);

len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
char *szGBK=new char[len + 1];
memset(szGBK, 0, len + 1);
WideCharToMultiByte (CP_ACP, 0, wszGBK, -1, szGBK, len, NULL,NULL);

strUtf8 = szGBK;
delete[] szGBK;
delete[] wszGBK;

return;
}
duck_z 2005-04-14
  • 打赏
  • 举报
回复
没法子了么?
duck_z 2005-04-12
  • 打赏
  • 举报
回复
的确像你们说的,但是,我怎么控制数据库内保存时用的编码类型呢,我在安装数据库试的编码设置里面已经设置了UTF-8了啊!
tl_pear 2005-04-11
  • 打赏
  • 举报
回复
其最终原因是:
正如 Sunmast(速马/Truly Madly Deeply) ( ) 所说:如果数据库内使用char或者varchar,那么你没法控制数据库内保存时用的编码类型。
tl_pear 2005-04-11
  • 打赏
  • 举报
回复
但是如上的办法,也很可能达不到你的要求!
tl_pear 2005-04-11
  • 打赏
  • 举报
回复
正如 Sunmast(速马/Truly Madly Deeply) ( ) 所说:如果数据库内使用char或者varchar,那么你没法控制数据库内保存时用的编码类型。
那么你也没有办法把你存入数据库的数据还原。但是你应该可以一通过加标志得到数据的还原。
如:
Dim enc As Encoding = Encoding.UTF8
Dim us As String = TextBox1.Text
Dim arr As Byte() = enc.GetBytes(us)
Dim i As Int16
us = ""
For i = 0 To (arr.Length - 1)
us = us + CStr(arr.GetValue(i)) + "/"
Next
us = us.Substring(0, us.Length - 1)
TextBox1.Text = us
Dim arrstr() As String
arrstr = us.Split("/")
For i = 0 To arrstr.Length - 1
arr(i) = CByte(arrstr(i))
Next
MsgBox(us)
us = System.Text.Encoding.UTF8.GetString(arr)
MsgBox(us)
duck_z 2005-04-11
  • 打赏
  • 举报
回复
楼上的,Unicode无论什么字符都是一个字节,呵呵
hamadou 2005-04-11
  • 打赏
  • 举报
回复
汉字就是占两个字节啊!长度40怎么保存40个汉字呢?
duck_z 2005-04-11
  • 打赏
  • 举报
回复
感谢各位大虾的鼎力相助,我实际的使用状况是这样的,我使用oracle9i数据库,在安装的时候,我已经选择编码为UTF-8编码,有一个varchar字段,长度定义40,但是,我使用sql语句保存的时候,却怎么也保存不了40个汉字,只能保存20个,所以才会想到转码的问题,请问,我该怎么做呢?
水如烟 2005-04-10
  • 打赏
  • 举报
回复
呵,谢谢楼上。我还真没接触过编码,不知道真正用在哪个地方。
只是有时看到打开的数据是“乱码”时才会想到应该是编码问题。
速马 2005-04-10
  • 打赏
  • 举报
回复
只有涉及到存储操作的时候,比如保存到文件,或者保存到字节数组,才会涉及到编码的概念
如果数据库内使用char或者varchar,那么你没法控制数据库内保存时用的编码类型
如果使用nchar、nvarchar或者ntext,那么你不需要做任何事,数据库内的就已经是unicode类型

用varbinary是最安全的做法(但是比起用ntext等,显然更麻烦)
速马 2005-04-10
  • 打赏
  • 举报
回复
>>> 如何吧“管理员”三个字转换成Unicode
Dim s As String = "管理员"
Dim data() As Byte = System.Text.Encoding.Unicode.GetBytes(s)
' 在这里把data这个Byte数组存入数据库

>>> 从数据库中去出来的时候再转换回来
Dim data() As Byte = '从数据库得到Byte数组
Dim s As String = System.Text.Encoding.Unicode.GetString(data)
chenyuming2004 2005-04-10
  • 打赏
  • 举报
回复
Dim text1 As String = "管理员"
Dim n1(3) As Integer
n1(0) = AscW(text1.Chars(0))
n1(1) = AscW(text1.Chars(1))
n1(2) = AscW(text1.Chars(2))

不知道你要的是不是这个。
水如烟 2005-04-10
  • 打赏
  • 举报
回复
或许是我提供的Return有问题。
水如烟 2005-04-10
  • 打赏
  • 举报
回复
主要的函数跟操作已经提供了。
说了是参考,你自己看看,好吗?
duck_z 2005-04-10
  • 打赏
  • 举报
回复
谢谢你,可是不行,
Console.WriteLine(tmp1 = tmpU)
结果的出来是true
水如烟 2005-04-10
  • 打赏
  • 举报
回复
仅供参考(我没用过这些转换,不知道结果是否如你所愿):
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim tmp As String = "管理员"
Dim tmpU As String = ToUnicode(tmp)
Dim tmp1 As String = ToDefault(tmpU)
Console.WriteLine(tmp)
Console.WriteLine(tmpU)
Console.WriteLine(tmp1)
End Sub

Private Function ToUnicode(ByVal DefaultString As String) As String
Dim tmpDefaultEncoding As System.Text.Encoding = System.Text.Encoding.Default
Dim tmpUnicodeEncoding As System.Text.Encoding = System.Text.Encoding.Unicode

Dim tmpBytes As Byte() = tmpDefaultEncoding.GetBytes(DefaultString.ToCharArray)
Dim tmpUBytes As Byte() = System.Text.Encoding.Convert(System.Text.Encoding.Default, System.Text.Encoding.Unicode, tmpBytes)
Return tmpUnicodeEncoding.GetString(tmpUBytes)
End Function
Private Function ToDefault(ByVal UnicodeString As String) As String
Dim tmpDefaultEncoding As System.Text.Encoding = System.Text.Encoding.Default
Dim tmpUnicodeEncoding As System.Text.Encoding = System.Text.Encoding.Unicode

Dim tmpUBytes As Byte() = tmpUnicodeEncoding.GetBytes(UnicodeString.ToCharArray)
Dim tmpBytes As Byte() = System.Text.Encoding.Convert(System.Text.Encoding.Unicode, System.Text.Encoding.Default, tmpUBytes)
Return tmpDefaultEncoding.GetString(tmpBytes)
End Function

16,553

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧