找回密码
 欢迎注册
搜索
热搜: 活动 交友 discuz
楼主: fc

困惑!!!(乱码!?)

[复制链接]
发表于 2003-4-29 13:08:16 | 显示全部楼层

困惑!!!(乱码!?)

对不起,我没有仔细看你转抄的说明,漏一个 \'\\\',也少算了一位。 现将其中一段改写如下,

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 += 6"
       }
     cPtr ++"
   }
return nLen"
}

 楼主| 发表于 2003-4-30 13:24:10 | 显示全部楼层

困惑!!!(乱码!?)

出来的是有 \\0xXX 的字串,可是反转换函数怎么写阿?
不过还有一个问题,Client发送的消息如果如果有 \\0xXX 的字串,Server不就是一定要有反转换函数?
但是如果我要发送给另一个系统(不是用VC写的)的时候,该系统Server能不能正确的把有 \\0xXX 的
字串的消息转换成中文阿?
我看过台湾的一些例子,生成的消息里都有中文,不过他们用的是XML写的!
发表于 2003-4-30 14:24:37 | 显示全部楼层

困惑!!!(乱码!?)

再看看这段。这里说 "are also escaped",  之前说了些啥?可能还有另外的方式。
"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"
反转换函数, 自己去 debug:
int ConvertFromPrintable(char *pszInStr, char *pszOutStr)
{
  char *cPtr = pszInStr"
  int nLen = 0"
  int nChr"
  char szTmp[8]"

  if (!pszInStr || !pszOutStr)
   return 0" // Invalid string pointers.
  *pszOutStr = \'\\0\'"
  while(*cPtr)
{
    if (*cPtr == \'\\\\\')
       {
          cPtr ++"
          if (*cPtr == \'0\') // 0xXX format
          {
            sscanf(cPtr, "%02X", &nChr);
            pszOutStr[nLen++] = nChr"
            cPtr += 5"
          }
          else if (*cPtr == \'U\') // UXXXX unicode format
          {
             strcpy(szTmp, "0x")"
             cPtr ++" // skip \'U\'
             strncpy(szTmp+2, cPtr, 2)"
             szTmp[4] = \'\\0\'"
             sscanf(szTmp, "%02X", &nChr);
             pszOutStr[nLen++] = nChr"
             cPtr += 2"
             strncpy(szTmp+2, cPtr, 2)"
             szTmp[4] = \'\\0\'"
             sscanf(szTmp, "%02X", &nChr);
             pszOutStr[nLen++] = nChr"
             cPtr += 3" // Skip \\ at the end also.
          }
           else if (*cPtr == \'M\') // MXXXXXX multi-byte format
          {
             strcpy(szTmp, "0x")"
             cPtr ++" // Skip \'M\'
             strncpy(szTmp+2, cPtr, 2)"
             szTmp[4] = \'\\0\'"
             sscanf(szTmp, "%02X", &nChr);
             pszOutStr[nLen++] = nChr"
             cPtr += 2"
             strncpy(szTmp+2, cPtr, 2)"
             szTmp[4] = \'\\0\'"
             sscanf(szTmp, "%02X", &nChr);
             pszOutStr[nLen++] = nChr"
             cPtr += 2"
             strncpy(szTmp+2, cPtr, 2)"
             szTmp[4] = \'\\0\'"
             sscanf(szTmp, "%02X", &nChr);
             pszOutStr[nLen++] = nChr"
             cPtr += 3" // Skip \\ at the end also.
          }
         else
           pszOutStr[nLen ++ ] = *cPtr ++"            
       }
   }
  return nLen"
}



发表于 2003-5-1 09:38:05 | 显示全部楼层

困惑!!!(乱码!?)

Bug 都找出来了没有?下面是改好的。

int ConvertFromPrintable(char *pszInStr, char *pszOutStr)
{
char *cPtr = pszInStr"
int nLen = 0, i, nByteCount = 0"
int nChr"

if (!pszInStr || !pszOutStr)
  return 0" // Invalid string pointers.
*pszOutStr = \'\\0\'"
while(*cPtr)
{
   if (*cPtr == \'\\\\\')
      {
         cPtr ++"
         switch(*cPtr)
         {
           case \'0\'"  // 0xXX format
             nByteCount = 1"
             cPtr += 2"
             break"
           case \'U\':
             nByteCount = 2" // UXXXX unicode format
             cPtr ++"
             break"
           case \'M\': // MXXXXXX multi-byte format
             nByteCount = 3"
             cPtr ++"
             break"
          default:
            break"
         }
         for (i = 0" i < nByteCount" i++)
         {
           sscanf(cPtr, "%02X", &nChr);
           pszOutStr[nLen++] = nChr"
           cPtr += 2"
         }
            cPtr ++" // Skip \\ at the end also.
      }
    else
      pszOutStr[nLen ++ ] = *cPtr ++"            
      
  }
return nLen"
}
 楼主| 发表于 2003-5-1 16:03:00 | 显示全部楼层

困惑!!!(乱码!?)

整段说明如下:
Escape Character:
Some user data may in fact contain these special delimiter characters. For this reason, HL7 has a system for escaping them. The system is a little bit unusual in that unlike a language like C, each character has a unique escape sequence.
The following table shows the escape sequences for each of the different characters:
图在上面:
Notice that the escape character itself has an escape sequence. Fortunately, if you use Chameleon you will never have to worry about these escape sequences. Chameleon takes care of it all automatically.
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.
发表于 2003-5-2 09:45:33 | 显示全部楼层

困惑!!!(乱码!?)

这些上下文看来都没有关系。
所以 encoder 一定要用到一个 ConvertToPrintable() 而 decoder 一定要用到 ConvertFromPrintable()。不然除英文外其他文字,包括西欧文字,都没法传。
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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