XM_字符转换

 

文本处理工具用C++写的

CEdit edit.GetLine(i+1, nstr, 1000); // 读取ANSI编码文本。 len = strlen(nstr); // ANSI格式长度 num = MultiByteToWideChar(CP_ACP, 0, nstr, len, szMultiByte, sizeof(szMultiByte)); // 转换成Unicode-16后的长度 len = num<<1; File.Write(&len, sizeof(SHORT)); File.Write(szMultiByte, sizeof(wchar_t)*num);   

注: #define CP_ACP                    0           // default to ANSI code page

 

客户端java读取

static String Text_FromUNICODE(byte[] src, int offset, int len) { char[] buf = new char[len>>1]; int s = offset; for(int i = 0; i < (len>>1); i++) { buf[i] = (char)((src[s++]&0xff) | ((src[s++] << 8)&0xff00)); } return new String(buf, 0, len>>1); } 

注:本来new String()支持Unicode-16,但是MultiByteToWideChar处理后写入的字节高低位跟Java相反, 所以这里要先转下。

 

疑问:为什么要转换成Unicode码?直接存成ANSI,然后客户端解析不久成了?

 

 

1 Unicode编码表 
 Unicode只有一个字符集,中、日、韩的三种文字占用了Unicode中0x3000到0x9FFF的部分  
  Unicode目前普遍采用的是UCS-2,它用两个字节来编码一个字符, 比如汉字"经"的编码是0x7ECF,注意字符编码一般用十六进制来 表示,为了与十进制区分,十六进制以0x开头,0x7ECF转换成十进制 就是32463,UCS-2用两个字节来编码字符,两个字节就是16位二进制, 2的16次方等于65536,所以UCS-2最多能编码65536个字符。 编码从0到127的字符与ASCII编码的字符一样,比如字母"a"的Unicode 编码是0x0061,十进制是97,而"a"的ASCII编码是0x61,十进制也是97, 对于汉字的编码,事实上Unicode对汉字支持不怎么好,这也是没办法的, 简体和繁体总共有六七万个汉字,而UCS-2最多能表示65536个,才六万 多个,所以Unicode只能排除一些几乎不用的汉字,好在常用的简体汉字 也不过七千多个,为了能表示所有汉字,Unicode也有UCS-4规范,就是用 4个字节来编码字符,不过现在普遍采用的还是UCS-2,只用两个字节来 编码,看一下Unicode对汉字的编码: 

 

2 汉字编码表  

http://www.cnblogs.com/whiteyun/archive/2010/07/06/1772218.html

 

 

UNICODE-16    UTF-8

 

 

Unicode  UTF-8  

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-00400000 - U-7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 

 

 

http://blog.csdn.net/xfly_studio/archive/2011/01/07/6122391.aspx

 

 

 

你可能感兴趣的:(XM_字符转换)