⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unicode coding.txt

📁 Windows环境下的Unicode编程
💻 TXT
📖 第 1 页 / 共 2 页
字号:
Windows环境下的Unicode编程

  国际上规定了两种二进制文字内码表示方法。
  ASCII是8位的,表示汉字需要两个字节以前大部分应用都使这种,不过有的时候会有乱码出现。UNICODE是16位的,比较好。

  ASCII是American Standard Code for Information Interchange的缩写,用来制订计算机中每个符号对应的代码,这也叫做计算机的内码(code)。每个ASCII码以1个字节(Byte)储存,从0到数字127代表不同的常用符号,例如大写A的ASCII码是65,小写a则是97。由于ASCII字节的七个位,最高位并不使用,所以后来又将最高的一个位也编入这套内码中,成为八个位的延伸ASCII(ExtendedASCII)码,这套内码加上了许多外文和表格等特殊符号,成为目前常用的内码。

  Unicode是Unified Code的缩写,也就是统一码。具体可参考:http://www.unicode.org/unicode/standard/translations/s-chinese.html 


  ASCII码:

  ASCII码是目前计算机中用得最广泛的字符集及其编码,是由美国国家标准局(ANSI)制定的ASCII码(American Standard Code for Information Interchange,美国标准信息交换码),它已被国际标准化组织(ISO)定为国际标准,称为ISO 646标准。适用于所有拉丁文字字母,ASCII码有7位码和8位码两种形式。 

  因为1位二进制数可以表示(21=)2种状态:0、1;而2位二进制数可以表示(22)=4种状态:00、01、10、11;依次类推,7位二进制数可以表示(27=)128种状态,每种状态都唯一地编为一个7位的二进制码,对应一个字符(或控制码),这些码可以排列成一个十进制序号0~127。所以,7位ASCII码是用七位二进制数进行编码的,可以表示128个字符。 
  第0~32号及第127号(共34个)是控制字符或通讯专用字符,如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BEL(振铃)等;通讯专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;第33~126号(共94个)是字符,其中第48~57号为0~9十个阿拉伯数字;65~90号为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。 

  注意:在计算机的存储单元中,一个ASCII码值占一个字节(8个二进制位),其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。 


  Unicode码:

  Unicode码也是一种国际标准编码,采用二个字节编码,与ANSI码不兼容。目前,在网络、Windows系统和很多大型软件中得到应用。


  手机通信中普遍使用Unicode码。例如手机短消息的发送是以PDU串的形式发送出去的,中文字符以Unicode码来表示,所以在发送中文短消息之前必须首先将中文字符转换为Unicode码。下面的函数将实现这个功能。

  这个函数主要应用到VB自带的一个格式转换函数:ChrW()将中文转换为Unicode码。  

  Public Function chg(rmsg As String) As String
  Dim tep As String
  Dim temp As String
  Dim i As Integer
  Dim b As Integer
  tep = rmsg
  i = Len(tep)
  b = i / 4
  If i = b * 4 Then
   b = b - 1
   tep = Left(tep, b * 4)
  Else
   tep = Left(tep, b * 4)
  End If
  chg = “”
  For i = 1 To b
   temp = “&H” & Mid(tep, (i - 1) * 4 + 1, 4)
   chg = chg & ChrW(CInt(Val(temp)))
  Next i
  End Function 


  另外一种:

  在日常编程中,常常需要把中文转换为unicode码:

StringBuilder sb = new StringBuilder();//Unicode
StringBuilder sa = new StringBuilder();//UTF-8
string s1;
string s2;
for(int i=0;i<sCode.length();i++)
{ 
byte[] bt = System.Text.Encoding.Unicode.GetBytes(sCode.Text.Substring(i,1));
if(bt.Length>1)//判断是否汉字
{
s1=Convert.ToString((short)(bt[1] - '\0'),16);//转化为16进制字符串
s2=Convert.ToString((short)(bt[0] - '\0'),16);//转化为16进制字符串
s1=(s1.Length==1?“0”:“”)+s1;//不足位补0
s2=(s2.Length==1?“0”:“”)+s2;//不足位补0
sa.Append("&#"+Convert.ToInt32(s1+s2,16)+“;”);
sb.Append("\\u"+s1+s2);
}
}
Clipboard.SetDataObject(sb.ToString());
txtUTF8.Text = sa.ToString();
txtUnicode.Text = sb.ToString(); 




  如何让自己的开发环境支持UNICODE?

  1.安装Visual Studio时,在选择VC++时需要加入unicode选项,保证相关的库文件可以拷贝到system32下。
  2.VC++中:工程/设置/C/C++/预处理程序定义(Preprocessor difinitions)/去除_MBCS,加_UNICODE,UNICODE 
              工程/设置/link/output/输入项-点符号(Entry)添加wWinMainCRTStartup 反之为MBCS(ANSI)编译。 




  Windows环境下Unicode编程总结

  一、让VC6支持Unicode

  通过使用unicode编译,软件可以适应多种情况,如何在自己的工程中添加这两种编译方式呢?下面是一个简单的步骤:
    
  1、选择“Build->Configurations”菜单
  2、点击“Add”按钮,添加“Unicode Debug” copysetting from “win32 Debug”配置
  3、添加“Unicode Release”copysetting from “win32 Release”配置 ,然后点击“OK”
  4、选择“Project->Setting”菜单
  5、切换到“General ”TAB页(可选)
  6、修改“Win32 Unicode Debug”的Intermediate Files和Output Files为DebugU (可选)  
  7、修改“Win32 Unicode Release”的Intermediate Files和Output Files为ReleaseU (可选)
  8、切换到“C++ ” Tab页
  9、从下拉列表框中选择“Preprocessor”
  10、为“Win32 Unicode Debug”和“Win32 Unicode Release”分别添加"_UNICODE,UNICODE " variables
  11、切换到“link ” Tab页, 从下拉列表框中选择“output” ,设置Entry为wWinMainCRTStartup(如果为cosole程序则不需要)

  12、在需要Unicode字符变量的地方用TCHAR(或WCHAR,两个是一样的)定义,如果需要ANSI则依然用char定义
  13、把所有的Unicode字符串常量用L宏包起来,比如 TCHAR* szText = L"我的Text";


  二、Unicode与UTF8的相互转换

///////////////////////////////////////////////////////////////////////////////
// Convert a UTF8 string to WCHAR string. 
// Caller must release the memory of pwszOutput by calling "delete[] pwszOutput ".
///////////////////////////////////////////////////////////////////////////////
HRESULT UTF8ToWChar( char * ptszInput, WCHAR ** pwszOutput )
{
    int cchOutput = 0;
    
    if( NULL == ptszInput || NULL == pwszOutput )
    {
        return( E_INVALIDARG );
    }

    //
    // Get output buffer size
    //
#ifndef UNICODE
    cchOutput = wcslen( ptszInput ) + 1;
#else //UNICODE
    cchOutput = MultiByteToWideChar( CP_UTF8, 0, ptszInput, -1, NULL, 0 );
    if( 0 == cchOutput )
    {
        return( HRESULT_FROM_WIN32( GetLastError() ) );
    }
#endif // UNICODE

    *pwszOutput = new WCHAR[ cchOutput ];
//memset( *pwszOutput, 0 , cchOutput + 1 ) ;
    if( NULL == *pwszOutput)
    {
        return( E_OUTOFMEMORY );
    }

#ifndef UNICODE
    wcsncpy( *pwszOutput, ptszInput, cchOutput );
#else //UNICODE
    if( 0 == MultiByteToWideChar( CP_UTF8, 0, ptszInput, -1, *pwszOutput, cchOutput ) )
    {
        //SAFE_ARRAYDELETE( *pwszOutput );
        return( HRESULT_FROM_WIN32( GetLastError() ) );
    }        
#endif // UNICODE

    return( S_OK );
}

///////////////////////////////////////////////////////////////////////////////
// Convert a WCHAR string to UTF8 string. 
// Caller must release the memory of ptszOutput by calling "delete[] ptszOutput ".
///////////////////////////////////////////////////////////////////////////////
HRESULT WCharToUTF8(WCHAR * pwszInput , char ** ptszOutput)
{
    int cchOutput = 0;
    
    if( NULL == pwszInput || NULL == ptszOutput )
    {
        return( E_INVALIDARG );
    }

    //
    // Get output buffer size
    //
#ifndef UNICODE
    cchOutput = wcslen( pwszInput ) + 1;
#else //UNICODE
    cchOutput = WideCharToMultiByte( CP_UTF8, 0, pwszInput, -1, NULL, 0 ,NULL ,NULL );
    if( 0 == cchOutput )
    {
        return( HRESULT_FROM_WIN32( GetLastError() ) );
    }
#endif // UNICODE

    *ptszOutput = new char[ cchOutput] ;
    if( NULL == *ptszOutput)
    {
        return( E_OUTOFMEMORY );
    }
memset( *ptszOutput , 0 , cchOutput) ;

#ifndef UNICODE
    wcsncpy( *ptszOutput, pwszInput, cchOutput );
#else //UNICODE
    if( 0 == WideCharToMultiByte( CP_UTF8, 0, pwszInput, -1, *ptszOutput, cchOutput,NULL ,NULL ) )
    {
        //SAFE_ARRAYDELETE( *ptszOutput );
        return( HRESULT_FROM_WIN32( GetLastError() ) );
    }        
#endif // UNICODE

    return( S_OK );

}



  三、UTF8与ANSI的相互转换

=====================================================
///////////////////////////////////////////////////////////////////////////////
// Convert a UTF8 string to ANSI string. 
// Caller must release the memory of pANSIOutput by calling delete[] pANSIOutput.
///////////////////////////////////////////////////////////////////////////////
BOOL   UTF8toANSI( char * pUtf8Input , char ** pANSIOutput )
{
if( NULL == pUtf8Input && NULL == pANSIOutput ) return FALSE ;

//convert to unicdoe firstly
    int nchOutput = MultiByteToWideChar( CP_UTF8, 0, pUtf8Input, -1, NULL, 0 );
    if( 0 == nchOutput )  
return FALSE ;

    WCHAR  * pWcharsz = new WCHAR[ nchOutput ];
ASSERT( pWcharsz != NULL ) ;
if( NULL == pWcharsz ) 
return FALSE ;
memset( pWcharsz , 0 , nchOutput * sizeof(WCHAR) ) ;
  
nchOutput = MultiByteToWideChar( CP_UTF8, 0, pUtf8Input, -1, pWcharsz, nchOutput )  ;
if( nchOutput <= 0 ) 
{
delete [] pWcharsz ;
return FALSE ;
}
//convert ANSI 
nchOutput = WideCharToMultiByte( CP_ACP, 0, pWcharsz, -1, NULL, 0 ,NULL ,NULL );
if( nchOutput <= 0 )
{
delete [] pWcharsz ;
return FALSE ;
}

* pANSIOutput  =  new char[nchOutput] ;
ASSERT( * pANSIOutput != NULL ) ;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -