📄 unicode coding.txt
字号:
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 + -