找回密码
 欢迎注册
搜索
热搜: 活动 交友 discuz
查看: 4205|回复: 20

困惑!!!(乱码!?)

[复制链接]
发表于 2003-4-22 19:52:10 | 显示全部楼层 |阅读模式
各位高手们,小弟刚刚接触HL7,希望各位多多指教哦!!万分感谢!!!!
我用VC写一个小小发送消息的程序,分Client和Server。Client连接的是Access,
Server连接的是Oracle。Client发送消息给Server的时候,如果一些数据是中文,
比如病人的名字等等,在Server出现的是乱码,究竟是什么问题?请各位高手指教指教!!!
发表于 2003-4-22 20:38:44 | 显示全部楼层

困惑!!!(乱码!?)

我们曾经在pb的情况下碰到过这样的问题,估计可能是开发工具对uncode字符集支持的问题。我们将pb6更新到pb8以后,没有修改任何代码测试通过,没有乱码。你可以找找这方面的原因
发表于 2003-4-22 20:43:50 | 显示全部楼层

困惑!!!(乱码!?)

这是Oracle字符集设置不一致的问题。检查Oracle在Server端和Client端的字符集设置是否相同。
详细说明可查阅有关数据库的论坛的内容。
 楼主| 发表于 2003-4-22 21:44:19 | 显示全部楼层

困惑!!!(乱码!?)

我是用iNTERFACEWARE Chameleon(英文版)开发工具写的,它的向导默认生成
一个Client和Server,我用vc写界面。我在iNTERFACEWARE Chameleon自动生成
的Client里把生成HL7消息所用的信息改成中文(本来是英文的),但是在
Server上显示的解析出来的信息里就变成乱码,只是中文变了乱码,
其他的英文或者数字都不会出现问题!究竟是VC的代码的问题,还是iNTERFACEWARE Chameleon工具本来的问题阿?
发表于 2003-4-23 13:36:21 | 显示全部楼层

困惑!!!(乱码!?)

我以前
发表于 2003-4-23 13:38:43 | 显示全部楼层

困惑!!!(乱码!?)

我以前医保接口程序时遇到过这个问题,修改Oracle的字符集设置,可以解决这个问题。
 楼主| 发表于 2003-4-23 13:51:46 | 显示全部楼层

困惑!!!(乱码!?)

我把Server与数据库的连接去掉了,只是在Server端用一个Edit显示数据,但是还是乱码!而且我发现Client里生成消息的时候,中文已经变成乱码了!
可能不能算是乱码吧,会不会是VC里的字符之间转换的问题阿?
因为对字符之间转换的问题不是很清楚,还要请各位高手指教指教!!!
发表于 2003-4-24 02:01:07 | 显示全部楼层

困惑!!!(乱码!?)

用 VC 时请注意用 wide characters。 类似 sprintf,sscanf 等的 string functions 都会造成问题。要用 wsprintf 之类 functions.
国标用到 ASCII 码之外的 8-bit characters,不要在字符之间转换时变成 7-bit printable ASCII。
发表于 2003-4-24 10:35:23 | 显示全部楼层

困惑!!!(乱码!?)

  我也遇到过这种问题,只是没有找到问题所在.后来请一个高手搞好了,我居然没有打听具体什么原因.所以到现在我还是有点迷茫.
 楼主| 发表于 2003-4-25 11:56:24 | 显示全部楼层

困惑!!!(乱码!?)

JB,能把你说VC的解决方法详细说明一下吗?我对VC里的字符不是很熟,
我摸索了一天,问题还是没有解决!
发表于 2003-4-25 13:00:11 | 显示全部楼层

困惑!!!(乱码!?)

那就先试试个更简单的程序,比如说一个 dialog-based application。就一个 edit control。
在 VC  Project->Setting->C++ 里 Preprocessor definition 栏拿掉 _MBCS,加 _UNICODE。
编译后打入中文,OK 后将 EDIT CONTROL 里的内容存到一个文件里。下次启动时从文件里调回到这个CONTROL 里,看看还是不是中文。
如果不会用 string functions,用 memcpy 或一个一个 byte 搬 string 就不会出问题。
 楼主| 发表于 2003-4-25 22:31:18 | 显示全部楼层

困惑!!!(乱码!?)

我改用了VB来写,iNTERFACEWARE Chameleon(英文版)开发工具自动生成VB的代码!我把里面的英文改为
中文,还是变成乱码,会不会是开发工具的问题呢?
VC下代码如下:
Message.Patient(0).SetSex("SEX")"
如果改为
Message.Patient(0).SetSex("男")"
Client生成的HL7的消息里就会变成 ‘DP’ 而不是‘男’
下面是函数的格式:
void SetName( const char* Value)"
这个问题已经困惑我很久了!那位高手帮小弟解决一下,感激不尽阿!!!!!!!!
发表于 2003-4-26 12:46:34 | 显示全部楼层

困惑!!!(乱码!?)

试试看 \'D\'+128 和 \'P\'+128 两个 bytes 出来的是不是国标里的 “男”。是的话就说明 8-bit 的字节在 iNTERFACEWARE Chameleon 内部变成了 7-bit.
我没用过 iNTERFACEWARE Chameleon。很难保证它内能支持 Unicode 或中文。 查查说明有没有诸如 _UNICODE 的 compiler flag.
 楼主| 发表于 2003-4-28 20:45:12 | 显示全部楼层

困惑!!!(乱码!?)

iNTERFACEWARE Chameleon手册里有下面一段话:
"Unprintable hex characters are also escaped in the format \\0xXX\\,
unicode characters in the format \\UXXXX\\,
and multi byte character sequences \\MXXXXXX\\ for far eastern language support"
但是我弄不懂在VC里该怎么用,JB大哥能否再帮小弟一把,如果再不解决中文的问题,我的程序就没
办法写下去了!!!!!万分感激!!!!
发表于 2003-4-29 10:41:14 | 显示全部楼层

困惑!!!(乱码!?)

这下有了。写一个象下面的 function 来转换字串,把转换完的字串给 Chameleon。
int ConvertToPrintable(char *pszInStr, char *pszOutStr)
{
  char *cPtr = pszInStr"
  int nLen = 0"
  if (!pszInStr || !pszOutStr)
     return 0" // Invalid string pointers.
  *pszOutStr = \'\\0\'"
  while(*cPtr)
   {
      if ((*cPtr > 31) &amp;&amp; (*cPtr < 128))
         {
            pszOutStr[nLen++] = *cPtr"
            pszOutStr[nLen] = \'\\0\'"            
         }
      else
        {
           sprintf(pszOutStr + nLen, "\\\\0x%02X", (int) *cPtr)"
           nLen += 4"
        }
      cPtr ++"
    }
  return nLen"
}
你原来的代码就应改成:
...
  char szOutStr[1024]"
  int nOutLen = 0"
  const char szSex = "男""
  ...
  
  if  (ConvertToPrintable(szSex, szOutStr))
     Message.Patient(0).SetSex(szOutStr)"
  ...
}
如果出来的结果不是中文,而是有 \\0xXX 的字串,你就还得写个反转换换函数。

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

本版积分规则

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