• 全部
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

Unicode转化的问题?

userxk 2005-07-08 12:49:57
private String expandString(String s) {
StringBuffer result = new StringBuffer();
int i, j, ch;
// native to ascii
for (i = 0; i < s.length(); i++) {
if (s.charAt(i) > 0x007f) {
// write \udddd
result.append('\\');
result.append('u');
String hex =
Integer.toHexString(s.charAt(i));
StringBuffer hex4 = new StringBuffer(hex);
hex4.reverse();
int len = 4 - hex4.length();
for (j = 0; j < len; j++) {
hex4.append('0');
}
for (j = 0; j < 4; j++) {
result.append(hex4.charAt(3 - j));
}
}
else {
result.append(s.charAt(i));
}
}
return result.toString();
}
上面的函数是J2ME里对socket中文发送的处理函数,现在用VC socket服务器端接收过来后是如下的编码形式:\u6a19\u984c,如何将它转化成正常的中文?在VC里处理。
...全文
336 点赞 收藏 14
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
victorzou 2005-10-06
mark
回复
qybao 2005-07-09
抽空写了段代码,你自己参考再做修改吧,大概测试了一下,基本上可以还原你的中文字

#include <iostream.h>
#include <Windows.h>
#include <string.h>
#include <ctype.h>
#include <math.h>

int parseInt(char* src, int radix) {
const int max_radix = 16;
char* fix_radix[max_radix] = {{"0"}, {"01"}, {"012"}, {"0123"}, {"01234"}, {"012345"}, {"0123456"}, {"01234567"},
{"012345678"}, {"0123456789"}, {"0123456789A"}, {"0123456789AB"}, {"0123456789ABC"},
{"0123456789ABCD"}, {"0123456789ABCDE"}, {"0123456789ABCDEF"},
};

if (src == NULL) {
return 0;
}

if (radix < 2 || radix > 16) {
return 0;
}

int i, index, result, len = strlen(src);
result = 0;
char s[2];
char *p;
memset(s, '\0', sizeof(s));
for (i =0; i<len; i++) {
memcpy(s, src+i, 1);
if (s[0] < '0' || s[0] > '9') {
s[0] = _toupper(s[0]);
}
if ((p=strstr(fix_radix[radix-1], s)) != NULL) {
index = p - fix_radix[radix-1];
} else {
index = 0;
}
result += index * (int)pow(radix, len-i-1);
}

return result;
}

char* toAscii(char* src, char* asciichar) {
int unicode = parseInt(src, 16);
if (unicode == 0) {
return NULL;
}

char unichar[2];
memset(unichar, '\0', sizeof(unichar));
unichar[0] = (char)(unicode >> 8);
unichar[1] = (char)unicode;
unichar[2] = '\0';
int len = WideCharToMultiByte(936,0,(LPWSTR)unichar,-1,NULL,0,NULL,NULL);
WideCharToMultiByte(936,0,(LPWSTR)unichar,-1,asciichar,len,NULL,NULL);

return asciichar;
}

int main(void) {

char unicode[8];
char asciicode[8];
memset(unicode, '\0', sizeof(unicode));
memset(asciicode, '\0', sizeof(asciicode));

strcpy(unicode, "6a19");
toAscii(unicode, asciicode);
cout << asciicode << endl;
strcpy(unicode, "984c");
toAscii(unicode, asciicode);
cout << asciicode << endl;

return 0;
}

测试结果:
??標
??題
不知道是否是你要的结果
回复
iamPaulYoung 2005-07-09
这个东西你试试看看Windows程序设计那本书的第二章,或许对你有启发
回复
userxk 2005-07-08
对 \u6a19\u984c 的转化其实是要先将它转化为二进制Unicode,然后再将这个二进制的Unicode转化为GB。
回复
goodboyws 2005-07-08
我的是把UNICODE转成GB,看来是反了
回复
userxk 2005-07-08
上面这段只是将ASCII转化为二进制Unicode.
回复
userxk 2005-07-08
public String unexpandString(String s) {
if (s == null) {
return null;
}
StringBuffer result = new StringBuffer();
int savedI, i, j, ch;
for (i = 0; i < s.length(); i++) {
if ( (ch = s.charAt(i)) == '\\') {
if (s.length() > i + 1 && s.charAt(i + 1) == 'u') {
savedI = i;
i += 2;
while (s.length() > i && s.charAt(i) == 'u') {
i++;
}
if (s.length() >= i + 4) {
ch =
Integer.parseInt(s.substring(i, i + 4), 16);
i += 3;
}
else {
i = savedI;
}
}//if (s.length() > i + 1 && s.charAt(i + 1) == 'u')
}//if ( (ch = s.charAt(i)) == '\\')
result.append( (char) ch);
}//for (i = 0; i < s.length(); i++)
return result.toString();
}
这是Java里的转化办法,在VC里ch =Integer.parseInt(s.substring(i, i + 4), 16);这段不好办.
回复
userxk 2005-07-08
能给个具体的转化吗?
回复
roscoe 2005-07-08
这个字串中\u是转义标识,你要将每个\uxxxx转换成相应的(MBCS|UNICODE)
这个和C中的\n道理相同
回复
userxk 2005-07-08
\u6a19\u984c 是ASCII 型的
Unicode。
回复
goodboyws 2005-07-08
不可能啊,除非你不是UNICODE
回复
userxk 2005-07-08
转出来只得到:u6a19u984c
回复
goodboyws 2005-07-08
LPWSTR pUnicode = L"xxxxxxx";
//这一步是求长度,如果不需要可以去掉
int targetLen=WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1, NULL,0,NULL,NULL);

BYTE* pTargetData=new BYTE[targetLen+1];
memset(pTargetData,0,targetLen+1);

WideCharToMultiByte(936,0,(LPWSTR)pUnicode,-1,(char *)pTargetData,targetLen,NULL,NULL);
回复
qybao 2005-07-08
在java里我知道,在vc里研究研究再说
我以前也曾用JAVA写过类似的,你看看对你是否有什么启发?
class Unicode {
private Unicode() {
//no constructor
}

public static String toUnicode(String src) {
if (src == null) {
return src;
}

String buffer, result = "";
try {
byte[] b = src.getBytes("UTF-16BE");
for (int i=0; i<b.length; i+=2) {
result += "\\u";
//System.out.println("b["+i+"]="+b[i]);
buffer = Integer.toHexString((int)b[i]);
if (buffer.length() >= 2) {
buffer = buffer.substring(buffer.length()-2);
} else {
buffer = "0" + buffer;
}
result += buffer;
//System.out.println("b["+(i+1)+"]="+b[i+1]);
buffer = Integer.toHexString((int)b[i+1]);
if (buffer.length() >= 2) {
buffer = buffer.substring(buffer.length()-2);
} else {
buffer = "0" + buffer;
}
result += buffer;
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}

public static String toAscii(String src) {
if (src == null) {
return src;
}

int src_len = src.length();
if (src_len != src.getBytes().length) {
return src;
}

int data_len = src_len / 6;
byte[] b = new byte[data_len * 2];
String buffer;
try {
for (int i=0; i<data_len; i++) {
buffer = src.substring(i*6, i*6+6);
if (! buffer.substring(0, 2).equals("\\u")) {
return src;
}
b[i*2] = Integer.valueOf(buffer.substring(2, 4), 16).byteValue();
//System.out.println("b["+(i*2)+"]="+b[i*2]);
b[i*2+1] = Integer.valueOf(buffer.substring(4), 16).byteValue();
//System.out.println("b["+(i*2+1)+"]="+b[i*2+1]);
}

buffer = new String(b, "UTF-16BE");
//System.out.println(buffer);
return buffer;

} catch (Exception e) {
e.printStackTrace();
return src;
}
}
}
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2005-07-08 12:49
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……