高分求助:Unicode字符集编码问题

kakashi0309 2009-04-23 08:13:19
这几天被Unicode编码问题搞得焦头烂额,主要原因还是我们程序的接口不是很好

程序主要是实现告警箱的短信转发功能,应用程序需要处理的是将短信内容进行编码转换,

统一转化为Unicode格式,而且限定的规则是:每个汉字表示成四个字节,比如“汉”,

编码0x6c49,字符串表示为’6’,’c’,’4’,’9’,对应4个字符

不知道哪种编码方式符合这种要求? (另外应用程序需要支持Solaris/Linux系统)

...全文
182 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
ok1234567 2009-04-25
  • 打赏
  • 举报
回复
如下片断代码供参考:

unsigned char *p=(unsigned char *)d;//三字节的 UTF-8 字串的指针
WORD w;//UNICODE 目标码
BYTE n;//单字节中间变量

//--如下对于三字节UTF-8码(p)转换到w中
n=*p;
n <<= 4;
w = n;
p++;
n=*p;
n <<= 2;
w += (n >> 4);
w <<= 8;

n=*p;
n <<= 6;
p++;
n += (*p & 0x3F);
w += n;
//-- w中为三字节汉字的UNICODE

ok1234567 2009-04-25
  • 打赏
  • 举报
回复
UTF-8编码规则
1字节 0xxxxxxx
2字节 110xxxxx 10xxxxxx
3字节 1110xxxx 10xxxxxx 10xxxxxx
4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
--第一个字节需要判断
处理汉字集,至少需要判断1字节和3字节两种情况:)
1字节,前置一个全0的字节
3字节,则按上面的位进行归并成两字节
kakashi0309 2009-04-25
  • 打赏
  • 举报
回复
谢谢楼上的 API我在Solaris系统下调用不

我也想着自己写函数进行转化,但是调试的时候总感觉有点不对劲

程序大体是这样的,用iconv函数进行编码转化,转化后的字符存放在char*指针dest,长度足够长

调试的时候,看到char*里面是UTF-8编码,\xe7\x94\xa8 每个汉字对应三个字节

btHigh = (*dest) & 0x0F; //btHigh 对应16位Unicode的前4位
dest++;

btMid = (*dest) & 0x3F; //btMid 对应16位Unicode的中间6位
dest++;

btLow = (*dest) & 0x3F; //btLow 对应16位Unicode的后6位
dest++;

不知道我这样的写法有什么不妥的地方



ok1234567 2009-04-25
  • 打赏
  • 举报
回复
做短信编码,不同的网关对于编码不统一,由于UNICODE是双字节,所以就有两种排列:高低、低高
这一点也要和网关提供商达成一致
ok1234567 2009-04-25
  • 打赏
  • 举报
回复
utf-8 to unicode
直接用API函数MultiByteToWideChar( CP_UTF8...就可以了
当然自己写一个这样的函数也很简单,因为UTF-8是UNICODE 的字节拆解/归并产生的,还原就可以了(UTF-8,每字符的长度为1-6字节)
kakashi0309 2009-04-25
  • 打赏
  • 举报
回复
呵呵 感谢大家的支持 现在中文字符问题已经解决

可以结贴啦 O(∩_∩)O~
biweilun 2009-04-25
  • 打赏
  • 举报
回复
22楼方法不错,用移位的思路很好
biweilun 2009-04-25
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 kakashi0309 的回复:]
调试的时候,看到char*里面是UTF-8编码,\xe7\x94\xa8 每个汉字对应三个字节

btHigh = (*dest) & 0x0F; //btHigh 对应16位Unicode的前4位
dest++;

btMid = (*dest) & 0x3F; //btMid 对应16位Unicode的中间6位
dest++;

btLow = (*dest) & 0x3F; //btLow 对应16位Unicode的后6位
dest++;

不知道我这样的写法有什么不妥的地方
[/Quote]
呵呵,你的char*里面是这样的话,你dest++就够了?第一个dest++应该改为dest=dest+4;第二个dest++则应改为dest=dest+6
kakashi0309 2009-04-24
  • 打赏
  • 举报
回复
现在我已经实现在solaris系统下汉字转为UTF-8的编码格式

现在的问题是转换后的编码格式双字节的,我得自己将每个字节再拆成两个

比如"汉" 编码是0x6c49,utf-8编码是 0x6c,0x49两个字节存放

现在我想转为4个字节 6,c,4,9

有什么好的方法实现? 谢谢大家啦
tian_yang_jian 2009-04-24
  • 打赏
  • 举报
回复
我也来学,顺便顶一下楼主
凤朝凰 2009-04-24
  • 打赏
  • 举报
回复
学习
yjgx007 2009-04-24
  • 打赏
  • 举报
回复
utf-8
zhuweiping2003 2009-04-24
  • 打赏
  • 举报
回复
过几天也要写使用 USC2 80编码方式 编码汉字的 程序
先来看看
用户 昵称 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 P_hantom 的回复:]
引用 2 楼 jennyvenus 的回复:
,’c’,’4’,’9’这几个字符也分unicode和ANSI。

他说了分4个字节,所以那4个字符是按照字节读的,不是按照字符读的
[/Quote]
他不是说4个字符吗?
居易锦风 2009-04-24
  • 打赏
  • 举报
回复
关于GSM也有字符的标准吧?除了语言环境,硬件环境也得匹配
kakashi0309 2009-04-24
  • 打赏
  • 举报
回复
现在汉字转为utf-8编码后,如何将utf-8的码流转为普通的Unicode双字节格式?
用户 昵称 2009-04-24
  • 打赏
  • 举报
回复
一般来说,用_stprintf就够了

TCHAR buf[ 20 ];
_stprintf( buf, _T( "%.4X" ), 值 );
xghuzd 2009-04-24
  • 打赏
  • 举报
回复
我想他的意思是编码为16进制字符串.
如果一个汉字 sprintf(buffer, "%04x", code); 就可以了.

一串就用下面的:
char * strCoding::ByteArr2HexStr( const BYTE* src, int len )
{
CString res;
for (int i = 0; i < len; i++)
{
int val = src[i];
char tmp[3];
sprintf_s(tmp, 3, "%02x", val);
res += tmp;
}
char * rt = new char[res.GetLength() + 1];
strcpy(rt, res);
return rt;
}
ok1234567 2009-04-24
  • 打赏
  • 举报
回复
utf-8, 对于标准汉字码,都是3字节
如果你的程序字符编码本来就是UNICODE(二字节/字符),直接循环使用ANSI格式函数,sprintf(szAnsi,"%04x",(short)*pUnicode);可能有编码顺序的问题!
如果你的程序字符编码为ANSI(多字节),则需要首先进行ANSI-->UNICODE转换(MultiByteToWideChar),然后再格式为ANSI字节串
会思考的草 2009-04-23
  • 打赏
  • 举报
回复
GSM对于字符编码不是有自己的规范吗?
加载更多回复(5)

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧