免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: knetfox
打印 上一主题 下一主题

如何解决informix卸载文本中的乱码 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-11-07 12:58 |只看该作者
在卸载有这种数据的字段后面加上个" ",同时使用"$"做为分隔符。
比如:unload to aaa.unl delimiter "$" select colA || " " from tab1;

论坛徽章:
0
12 [报告]
发表于 2007-11-07 15:24 |只看该作者
我觉得是你的字符集有问题
请查以下几个变量
DB_LOCALE
SERVER_LOCALE
CLIENT_LOCLE

论坛徽章:
0
13 [报告]
发表于 2007-11-07 16:02 |只看该作者
我也遇到了类似问题,可能是建表的时候这个字段设定的不够长,差半个字节,结果导致半个汉字录入了该字段中,用unload或者dbexport导出或者备份后,这半个汉字和后面的分隔符 |  有合并成了一个汉字,导致这个分隔符就不存在了,这样再load或者dbimport就失败。谁有好的方法解决呢。

论坛徽章:
0
14 [报告]
发表于 2007-11-09 15:26 |只看该作者
原帖由 xjfirst 于 2007-11-7 12:58 发表
在卸载有这种数据的字段后面加上个" ",同时使用"$"做为分隔符。
比如:unload to aaa.unl delimiter "$" select colA || " " from tab1;



这样,即使可以解决分割符的问题,但半个中文字符与空格组成的字符是个乱码,比如把它传到window系统中,从文本上看是个"?",
但导入其它数据库中是无法导入的。

论坛徽章:
0
15 [报告]
发表于 2007-11-10 11:18 |只看该作者
是的,我的方法是在把导出的文本转换成xml文件时使用的,对于把导出的文本再导入其它数据库还真没试过,不过,我之前写过一段代码不知对你有没有用处:

  1. #include <stdio.h>

  2. void main(int argc, char *argv[])
  3. {
  4.         FILE *fsrc, *fdes;
  5.         char *src, *des;
  6.         unsigned char ch1, ch2;

  7.         if(argc != 3) {
  8.                 printf("Usage: eraseHalfCh.exe src des\n");
  9.                 exit(1);
  10.         }

  11.         src = (char*) malloc ((strlen(argv[1]) + 1) * sizeof(char));
  12.         if(src == NULL) {
  13.                 printf("Out of memory!\n");
  14.                 exit(1);
  15.         }

  16.         des = (char*) malloc ((strlen(argv[2]) + 1) * sizeof(char));
  17.         if(des == NULL) {
  18.                 printf("Out of memory!\n");
  19.                 exit(1);
  20.         }

  21.         memset(src, 0, (strlen(src) + 1) * sizeof(char));
  22.         memset(des, 0, (strlen(des) + 1) * sizeof(char));

  23.         memcpy(src, argv[1], strlen(argv[1]));
  24.         memcpy(des, argv[2], strlen(argv[2]));

  25.         fsrc = fopen(src, "r");
  26.         if(fsrc == NULL) {
  27.                 printf("Error to open file %s\n", src);
  28.                 exit(1);
  29.         }

  30.         fdes = fopen(des, "w");
  31.         if(fdes == NULL) {
  32.                 printf("Error to open file %s\n", des);
  33.                 exit(1);
  34.         }

  35.         ch1 = fgetc(fsrc);
  36.         while(!feof(fsrc)) {
  37.                 if(ch1 > 0xA0) { /* 说明是汉字 */
  38.                         ch2 = fgetc(fsrc);
  39.                         if(ch2 > 0xA0) { /* 说明是一个完整的汉字 */
  40.                                 fputc(ch1, fdes);
  41.                                 fputc(ch2, fdes);
  42.                         } else { /* 说明是半个汉字需将其去除 */
  43.                                 fputc(ch2, fdes);
  44.                         }
  45.                 } else { /* 不是汉字直接写入 */
  46.                         fputc(ch1, fdes);
  47.                 }
  48.                 ch1 = fgetc(fsrc);
  49.         }

  50.         fclose(fsrc);
  51.         fclose(fdes);
  52. }
复制代码

论坛徽章:
0
16 [报告]
发表于 2007-11-10 11:20 |只看该作者
这个程序有个小问题,对于"珅", "東"等字会判定失误。实际上,对于户名这样的字段,仅仅是gb2312会有很大的问题。需要GBK的支持。

论坛徽章:
0
17 [报告]
发表于 2007-11-11 17:37 |只看该作者
对于半个汉字的问题数据库是无法解决的,因为数据库并不知道这是半个汉字,它都会试图以一个汉字来解释,你可以将你的DB_LOCALE=en_us.utf8,这样数据库在存储数据的时候都以单字节进行,至于是完整汉字还是非完整汉字就看你前端的程序怎么去解释了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP