LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1743|回复: 7

串口发短信,要使用UCS2,如何实现?给点思路

[复制链接]
发表于 2006-11-29 18:14:44 | 显示全部楼层 |阅读模式
一般情况下,我们在C语言里面编写如下代码:
  1. char szBuf[] = "hello中国";
复制代码

请问其中的中国是什么编码?GBK?

下面的代码:
  1. char szSrc[] = "中国*********";
  2. char szDes[128] = {0};
  3. code_convert(szSrc, szDes);

  4. int iTmp = 0;
  5. int iMax = strlen(szSrc);
  6. for (iTmp = 0; iTmp < iMax; iTmp++)
  7. {
  8.         printf("%x ", szSrc[iTmp]);
  9. }
  10. printf("\n");
复制代码

结果是:
  1. ffffffd6 ffffffd0 ffffffb9 fffffffa ffffffb9 ffffffb2 ffffffb2 fffffffa ffffffb5 ffffffb3
复制代码


在使用iconv函数转换为UCS2时,需要指定源编码,我指定为GBK,转码后的结果:
  1. 2d 4e fffffffd 56 71 51 ffffffa7 4e 5a 51
复制代码

为什么有的能转,有的不能呢?
发表于 2006-11-29 19:01:21 | 显示全部楼层
如果想要从 GBK 转为 UCS2,首先要确保你的代码是以 GBK 编码保存并编译的

另外楼主最好帖一下你调用 iconv 的那一部分代码,也许有错

我以前写这种程序时是用 UTF8 转 UCS2 的,自己写了一个转换函数,非常容易。GBK 的要麻烦一些,我当时是用查表法实现的。
回复 支持 反对

使用道具 举报

发表于 2006-11-29 22:17:48 | 显示全部楼层
源码中的中文的编码,要看你的编辑器设置和系统环境的locale设置
比如我系统是utf8,但是我在eclipse里设置了源码编码为gbk,结果源码编码就是gbk
如果你的编辑器编码使用缺省值,那可能就是系统设置
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-30 09:32:31 | 显示全部楼层
Post by DoDo
如果想要从 GBK 转为 UCS2,首先要确保你的代码是以 GBK 编码保存并编译的

另外楼主最好帖一下你调用 iconv 的那一部分代码,也许有错

我以前写这种程序时是用 UTF8 转 UCS2 的,自己写了一个转换函数,非常容易。GBK 的要麻烦一些,我当时是用查表法实现的。


代码如下:
  1. int code_convert(char *from, char *to)
  2. {
  3.         int iMax = 1024, iFromLen, iToLen, iRet;
  4.     iconv_t cd;         
  5.     char  *pFrom, *pTo;

  6.         char *from_code = "GB18030";
  7.         char *to_code = "UCS2";
  8.    
  9.     if(from == NULL || to == NULL) return -1;

  10.     cd = iconv_open((const char *)to_code, (const char *)from_code);
  11.     if (cd == (iconv_t)-1) {
  12.         return -1;
  13.     }

  14.         pFrom = from;
  15.         pTo = to;
  16.         iFromLen = strlen(pFrom);
  17.         iToLen = iMax;
  18.        
  19.         iRet = iconv(cd, &pFrom, &iFromLen, &pTo, &iToLen);
  20.         iconv_close(cd);
  21.         if (iRet == -1)
  22.         {
  23.                 return -1;
  24.         }

  25.         pTo[iMax - iToLen] = 0;
  26.         printf("%d -- %d\n", iMax - iToLen, iRet);
  27.         return 0;
  28. }
复制代码

奇怪的是iRet返回为0,但是iToLen确被修改过了。为什么呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-30 09:34:39 | 显示全部楼层
Post by x11
源码中的中文的编码,要看你的编辑器设置和系统环境的locale设置
比如我系统是utf8,但是我在eclipse里设置了源码编码为gbk,结果源码编码就是gbk
如果你的编辑器编码使用缺省值,那可能就是系统设置


你好。
我是直接vi的源代码,没有进行任何设置,我估计是和系统的一样。但是请问如何查看系统的编码呢?
另外,strlen("中国") 的值为4啊。utf8不是使用的变长编码吗?

谢谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-30 09:48:59 | 显示全部楼层
而且,我使用iconv_open获得的值为0x805e968,相对的大啊!是不是说出错了?
回复 支持 反对

使用道具 举报

发表于 2006-12-2 21:02:33 | 显示全部楼层
如果楼主想从 GBK 转到 UCS2,那么 from 似乎用“GBK”或者“GB2312”比较好,我当时是用 GB2312 的。

如果用 VIM,那么可以
:set fileencodings=ucs-bom,utf-8,cp936,big5,euc-jp,euc-kr,latin1
:set fileencoding=cp936
来设置文件编码(至少要确保你那句待转换的中文字符串所在的文件被设置了正确的编码)

至于 iconv 返回值的问题,是这样的,它一边转换一边(内部)计数,如果转换的过程中无错返回内部的计数值,有错误则计数值返回为 0,但是出错之前已经被转换的内容并不会被清空。
回复 支持 反对

使用道具 举报

发表于 2006-12-2 21:05:25 | 显示全部楼层
Post by bineon
你好。
我是直接vi的源代码,没有进行任何设置,我估计是和系统的一样。但是请问如何查看系统的编码呢?
另外,strlen("中国") 的值为4啊。utf8不是使用的变长编码吗?

谢谢

用 locale 查看系统的编码
在 vim 中用 :set fileencoding=<C-d> 来查看当前文件的编码,就是输入“=”之前的内容,包括“=”,然后按 Ctrl-d

strlen 中的字符串的编码取决于代码文件使用的编码。

utf8 中部分中文为 2 字节码,部分中文为 3 字节码。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表