针对ice部分代码修改问题

一、如何解决printf UTF8乱码问题
1、在启动icebox时,当网络故障产生报警时,打印的内容如下:
    "璇曞浘璁块棶鏃犳晥鐨勫湴鍧€銆?"

2、增加编译的宏:CONVER_WS2S(E:\Ice-3.5.1\cpp\src\IceUtil\Makefile.mak)
CPPFLAGS        = $(CPPFLAGS) -DICE_UTIL_API_EXPORTS -I.. -DWIN32_LEAN_AND_MEAN -DCONVER_WS2S

3、修改iceutil/unicode.cpp代码,增加如下代码ws2s和s2ws:

static std::string
ws2s(const std::wstring& ws)
{
    std::string curLocal = setlocale(LC_ALL, "");
    const wchar_t* source = ws.c_str();
    size_t wsize = 2 * ws.size() + 1;
    char* dest = new char[wsize];
    memset(dest, 0, wsize);
    size_t converted = 0;
    wcstombs_s(&converted, dest, wsize, source, _TRUNCATE);
    std::string result = dest;
    delete []dest;
    return result;
}

static std::wstring
s2ws(const std::string& s)
{
    std::string curLocal = setlocale(LC_ALL, "");
    const char* source = s.c_str();
    size_t size = s.size() + 1;
    wchar_t* dest = new wchar_t[size];
    memset(dest, 0, size);
    size_t converted = 0;
    mbstowcs_s(&converted, dest, size, source, _TRUNCATE);
    std::wstring result = dest;
    delete []dest;    
    return result;
}
4、修改iceutil/unicode.cpp代码,增加宏开关:
string
IceUtil::wstringToString(const wstring& wstr, ConversionFlags flags)
{
    string target;
#ifndef CONVER_WS2S   
    size_t size = wstr.size() * 3 * (sizeof(wchar_t) / 2);

    Byte* outBuf = new Byte[size];
    Byte* targetStart = outBuf;
    Byte* targetEnd = outBuf + size;

    const wchar_t* sourceStart = wstr.data();
 
    ConversionResult cr =
        convertUTFWstringToUTF8(
            sourceStart, sourceStart + wstr.size(),
            targetStart, targetEnd, flags);
        
    if(cr != conversionOK)
    {
        delete[] outBuf;
        assert(cr == sourceExhausted || cr == sourceIllegal);
        throw UTFConversionException(__FILE__, __LINE__,
                                     cr == sourceExhausted ? partialCharacter : badEncoding);
    }
    
    string s(reinterpret_cast<char*>(outBuf),
             static_cast<size_t>(targetStart - outBuf));
    s.swap(target);
    delete[] outBuf;
#else
    target = ws2s(wstr);
#endif
    return target;
}
4、重新编译安装
$cd E:\Ice-3.5.1\cpp\src\iceUtil
$nmake /f Makefile.mak
$nmake /f Makefile.mak install

5、上述的乱码真正打印的结果如下:
"试图访问无效的地址。"

二、ICE如何支持.net 3.5?
1、E:\Ice-3.5.1\cs\config\Make.rules.mak.cs使其FRAMEWORK开关打开:
#
# Define FRAMEWORK as 3.5 to force a .NET 3.5 build with Visual Studio 2010.
#

FRAMEWORK = 3.5

2、E:\Ice-3.5.1\cs\src\Ice\Makefile.mak

!if "$(FRAMEWORK)" == "3.5"
MCSFLAGS    = $(MCSFLAGS) -define:DISENABLEDIPV6
!endif

3、修改源代码Network.cs如下
 
public static Socket createServerSocket(bool udp, AddressFamily family, int protocol)
        {
            Socket socket = createSocket(udp, family);
#  if !DISENABLEDIPV6 && !COMPACT && !UNITY && !__MonoCS__ && !SILVERLIGHT
            if (family == AddressFamily.InterNetworkV6 && protocol != EnableIPv4)
            {
                try
                {
                    int flag = protocol == EnableIPv6 ? 1 : 0;
                    socket.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, flag);
                }
                catch(SocketException ex)
                {
                    closeSocketNoThrow(socket);
                    throw new Ice.SocketException(ex);
                }
            }
#endif
            return socket;
        }
4、重新编译安装
$cd E:\Ice-3.5.1\cs\src
$nmake /f Makefile.mak
$nmake /f Makefile.mak install

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值