CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  ASP.NET

请问如何用代码实现把一段utf-8编码的字符串转换成gb2312编码的(C#)

楼主edwardfay(都说养儿为防老,山高水远他乡流)2003-11-04 15:55:22 在 .NET技术 / ASP.NET 提问

就这么点分了,各位帮帮忙吧!!! 问题点数:20、回复次数:6Top

1 楼KK4(逐月)回复于 2003-11-04 16:16:39 得分 0

這應該涉及內碼轉換Top

2 楼slinfo(MCSE MCSD.NET)回复于 2003-11-04 16:23:35 得分 5

Encoding.Convert(Encoding,   Encoding,   Byte[])      
  将字节数组从一种编码转换为另一种。  
  [C#]  
  [Serializable]  
  public   static   byte[]   Convert(  
        Encoding   srcEncoding,  
        Encoding   dstEncoding,  
        byte[]   bytes  
  );  
  参数  
  srcEncoding    
  bytes   所用的编码。    
  dstEncoding    
  返回的字节数组所需的编码。    
  bytes    
  要转换的字节。    
  返回值  
  Byte   类型的数组,包含转换结果。  
   
  Top

3 楼flyinglz(云溪飘叶)回复于 2003-11-04 16:30:46 得分 0

System.Text.UTF8Encoding.Convert(...,..,..);Top

4 楼edwardfay(都说养儿为防老,山高水远他乡流)回复于 2003-11-04 16:38:33 得分 0

老大,能不能写个具体点的例子啊?Top

5 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2003-11-08 16:10:03 得分 15

我这个是用VBS做的,C#有简单的办法。关键是思想  
  <HTML>  
  <HEAD>  
  <META   name=VI60_defaultClientScript   content=VBScript>  
  <META   NAME="GENERATOR"   Content="Microsoft   Visual   Studio   6.0">  
  <TITLE></TITLE>  
  <meta   http-equiv="Content-Type"   content="text/html;   charset=gb2312"></HEAD>  
  <BODY><pre>  
  输入:"http://www.google.com/search?hl=en&ie=UTF-8&oe=UTF-8&q=%E5%85%B3%E9%94%AE%E5%AD%97&btnG=Google+Search"  
  输出:关键字</pre>  
  <SCRIPT   LANGUAGE=vbscript>  
  <!--  
   
  mystr="http://www.google.com/search?hl=en&ie=UTF-8&oe=UTF-8&q=%E5%85%B3%E9%94%AE%E5%AD%97&btnG=Google+Search"  
   
  function   getutf8(x)  
  '这个函数是用来得到%号的部分,  
  '输入条件是""http://www.google.com/search?hl=en&ie=UTF-8&oe=UTF-8&q=%E5%85%B3%E9%94%AE%E5%AD%97&btnG=Google+Search"  
  A=split(x,"&")'定义一个临时数组  
  dim   i:i=0'临时的指针  
  for   i=0   to   ubound(A)  
  if   instr(A(i),"%")>0   then    
  B=split(A(i),"=")'靠!再定义一个临时数组,省事,浪费内存比浪费我的生命强  
  getutf8=B(1)  
  exit   for  
  end   if  
  next  
  getutf8=right(getutf8,len(getutf8)-1)'去掉左边的%  
  end   function  
   
  msgbox   U8toU(getutf8(mystr))  
   
  function   c16to2(x)  
  '这个函数是用来转换16进制到2进制的,可以是任何长度的,一般转换UTF-8的时候是两个长度,比如A9  
  '比如:输入“C2”,转化成“11000010”,其中1100是"c"是10进制的12(1100),那么2(10)不足4位要补齐成(0010)。  
  dim   tempstr  
  dim   i:i=0'临时的指针  
  for   i=1   to   len(trim(x))  
  tempstr=   c10to2(cint(int("&h"   &   mid(x,i,1))))  
  do   while   len(tempstr)<4  
  tempstr="0"   &   tempstr'如果不足4位那么补齐4位数  
  loop  
  c16to2=c16to2   &   tempstr  
  next  
  end   function  
   
   
   
  'document.write   hex(asc("字"))   &   "<br>"  
   
  function   U8toU(x)  
  '输入一堆有%分隔的字符串,先分成数组,根据utf8规则来判断补齐规则  
  '输入:关   E5   85   B3     键     E9   94   AE 字       E5   AD   97  
  '输出:关   B9D8     键     BCFC 字       D7D6  
  dim   WeiS'要判断第一个编码的位数  
  dim   Unicode'二进制的Unicode码  
  dim   alpha'定义单个字符  
  A=split(x,"%")'定义一个临时数组  
  dim   i:i=0'临时的指针  
  dim   j:j=0'临时的指针  
   
  for   i=0   to   ubound(A)  
  A(i)=c16to2(A(i))'第一次循环,先转换成2进制再说  
   
  next  
   
  for   i=0   to   ubound(A)-1  
  WeiS=instr(A(i),"0")'判断第一次出现0的位置,  
  '可能是1(单字节),3(3-1字节),4,5,6,7不可能是2和大于7  
  '理论上到7,实际不会超过3。  
   
  Unicode=""  
  for   j=1   to   WeiS-1  
  if   j=1   then    
  A(i)=right(A(i),len(A(i))-WeiS)'第一个去掉最左边的WeiS个  
  Unicode=Unicode   &   A(i)  
   
  else  
  i=i+1  
  A(i)=right(A(i),len(A(i))-2)'其余去掉最左边的两个  
  Unicode=Unicode   &   A(i)  
  end   if  
   
  next  
  U8toU=U8toU   &   chrw(int("&H"   &   c2to16(Unicode)))'总算完了,妈的!!  
   
   
  next  
   
  end   function  
  'msgbox   c2to16("11100101")  
   
  function   c2to16(x)  
  '2进制到16进制的转换,每4个0或1转换成一个16进制字母,输入长度当然不可能不是4的倍数了  
   
  dim   i:i=1'临时的指针  
  for   i=1   to   len(x)     step   4  
  c2to16=c2to16   &   hex(c2to10(mid(x,i,4)))  
  next  
  end   function    
   
  function   c2to10(x)  
  '单纯的2进制到10进制的转换,不考虑转16进制所需要的4位前零补齐。  
  '因为这个函数很有用!以后也会用到,做过通讯和硬件的人应该知道。  
  '这里用字符串代表二进制  
  dim   mysign   :mysign=sgn(cint(x))'定义mysign这个东西,首先判断正负符号  
  x=abs(cint(int(x)))  
  c2to10=0  
  if   x="0"   then   exit   function'如果是0的话直接得0就完事  
  dim   i:i=0'临时的指针  
  for   i=   0   to   len(x)   -1'否则利用8421码计算,这个从我最开始学计算机的时候就会,好怀念当初教我们的谢道建老先生啊!  
  if   mid(x,len(x)-i,1)="1"   then   c2to10=c2to10+2^(i)  
  next  
  if   mysign=-1   then   c2to10=-1   *   c2to10'加上正负符号  
  end   function  
   
   
  function   c10to2(x)'10进制到2进制的转换  
  '这个函数在计算16位到2位转换时候用到了,  
  '没有做在16位里面是因为这个函数只是单纯10-2转换,不涉及16进制由4个2进制补齐空位,将来可以用到任何地方  
  '比如输入2,输出“10”而不是“0010”  
  '首先判断正负符号  
  dim   mysign:mysign=sgn(x)'定义一个符号标记  
  x=abs(x)  
  '然后判断有几位,至少一位  
  dim   WeiS:WeiS=1  
  do    
  if   x<2^WeiS   then  
  exit   do  
  else  
  WeiS=WeiS+1  
  end   if  
  loop  
  dim   tempnum:tempnum=x'定义一个临时的数字  
  dim   i:i=0'临时的指针  
  for   i=   WeiS   to   1   step-1  
  if   tempnum>=2^(i-1)   then  
  tempnum=tempnum-2^(i-1)  
  c10to2=c10to2   &   "1"        
  else  
  c10to2=c10to2   &   "0"  
  end   if  
  next  
  if   mysign=-1   then   c10to2="-"   &   c10to2'加上正负符号  
  end   function  
   
   
  -->  
  </SCRIPT>  
  </BODY>  
  </HTML>  
  Top

6 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2003-11-08 16:11:30 得分 0

什么是   UTF-8?  
  首先   UCS   和   Unicode   只是分配整数给字符的编码表.   现在存在好几种将一串字符表示为一串字节的方法.   最显而易见的两种方法是将   Unicode   文本存储为   2   个   或   4   个字节序列的串.   这两种方法的正式名称分别为   UCS-2   和   UCS-4.   除非另外指定,   否则大多数的字节都是这样的(Bigendian   convention).   将一个   ASCII   或   Latin-1   的文件转换成   UCS-2   只需简单地在每个   ASCII   字节前插入   0x00.   如果要转换成   UCS-4,   则必须在每个   ASCII   字节前插入三个   0x00.  
   
  在   Unix   下使用   UCS-2   (或   UCS-4)   会导致非常严重的问题.   用这些编码的字符串会包含一些特殊的字符,   比如   '\0'   或   '/',   它们在   文件名和其他   C   库函数参数里都有特别的含义.   另外,   大多数使用   ASCII   文件的   UNIX   下的工具,   如果不进行重大修改是无法读取   16   位的字符的.   基于这些原因,   在文件名,   文本文件,   环境变量等地方,   UCS-2   不适合作为   Unicode   的外部编码.  
   
  在   ISO   10646-1   Annex   R   和   RFC   2279   里定义的   UTF-8   编码没有这些问题.   它是在   Unix   风格的操作系统下使用   Unicode   的明显的方法.  
   
  UTF-8   有一下特性:    
   
  UCS   字符   U+0000   到   U+007F   (ASCII)   被编码为字节   0x00   到   0x7F   (ASCII   兼容).   这意味着只包含   7   位   ASCII   字符的文件在   ASCII   和   UTF-8   两种编码方式下是一样的.    
   
  所有   >U+007F   的   UCS   字符被编码为一个多个字节的串,   每个字节都有标记位集.   因此,   ASCII   字节   (0x00-0x7F)   不可能作为任何其他字符的一部分.    
   
  表示非   ASCII   字符的多字节串的第一个字节总是在   0xC0   到   0xFD   的范围里,   并指出这个字符包含多少个字节.   多字节串的其余字节都在   0x80   到   0xBF   范围里.   这使得重新同步非常容易,   并使编码无国界,   且很少受丢失字节的影响.    
   
  可以编入所有可能的   231个   UCS   代码    
   
  UTF-8   编码字符理论上可以最多到   6   个字节长,   然而   16   位   BMP   字符最多只用到   3   字节长.    
   
  Bigendian   UCS-4   字节串的排列顺序是预定的.    
   
  字节   0xFE   和   0xFF   在   UTF-8   编码中从未用到.    
   
  下列字节串用来表示一个字符.   用到哪个串取决于该字符在   Unicode   中的序号.  
   
  U-00000000   -   U-0000007F:  
    0xxxxxxx  
     
  U-00000080   -   U-000007FF:  
    110xxxxx   10xxxxxx  
     
  U-00000800   -   U-0000FFFF:  
    1110xxxx   10xxxxxx   10xxxxxx  
     
  U-00010000   -   U-001FFFFF:  
    11110xxx   10xxxxxx   10xxxxxx   10xxxxxx  
     
  U-00200000   -   U-03FFFFFF:  
    111110xx   10xxxxxx   10xxxxxx   10xxxxxx   10xxxxxx  
     
  U-04000000   -   U-7FFFFFFF:  
    1111110x   10xxxxxx   10xxxxxx   10xxxxxx   10xxxxxx   10xxxxxx  
     
   
  xxx   的位置由字符编码数的二进制表示的位填入.   越靠右的   x   具有越少的特殊意义.   只用最短的那个足够表达一个字符编码数的多字节串.   注意在多字节串中,   第一个字节的开头"1"的数目就是整个串中字节的数目.  
   
  例如:   Unicode   字符   U+00A9   =   1010   1001   (版权符号)   在   UTF-8   里的编码为:  
   
  11000010   10101001   =   0xC2   0xA9  
   
  而字符   U+2260   =   0010   0010   0110   0000   (不等于)   编码为:  
   
  11100010   10001001   10100000   =   0xE2   0x89   0xA0  
   
  这种编码的官方名字拼写为   UTF-8,   其中   UTF   代表   UCS   Transformation   Format.   请勿在任何文档中用其他名字   (比如   utf8   或   UTF_8)   来表示   UTF-8,   当然除非你指的是一个变量名而不是这种编码本身.  
   
  什么编程语言支持   Unicode?  
  在大约   1993   年之后开发的大多数现代编程语言都有一个特别的数据类型,   叫做   Unicode/ISO   10646-1   字符.   在   Ada95   中叫   Wide_Character,   在   Java   中叫   char.  
   
  ISO   C   也详细说明了处理多字节编码和宽字符   (wide   characters)   的机制,   1994   年   9   月   Amendment   1   to   ISO   C   发表时又加入了更多.   这些机制主要是为各类东亚编码而设计的,   它们比处理   UCS   所需的要健壮得多.   UTF-8   是   ISO   C   标准调用多字节字符串的编码的一个例子,   wchar_t   类型可以用来存放   Unicode   字符.  
   
   
  Top

相关问题

  • 字符串编码〉???请教
  • 字符串编码问题
  • 如何把一个 字符串 用标准的c 把ansi变成 utf-8编码?
  • 怎样把unicode编码的汉字字符串转化为ASCII和GB2312编码的,C#里
  • 怎样把邮件信息中的base64编码的字符串提取出来,并转换成解码后的正常字符串,(c#实现)
  • 请问C/C++里转换字符串编码格式(比如从"GB18030"转换到Unicode)的方法?
  • 截取字符串(C#)
  • C++字符串连接?
  • C++字符串连接?
  • C# 的字符串处理

关键词

  • c#
  • search
  • google
  • e5%
  • utf

得分解答快速导航

  • 帖主:edwardfay
  • slinfo
  • superdullwolf

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo