您的位置:首页 > 编程语言

针对ice部分代码修改问题

2014-07-03 11:25 344 查看
一、如何解决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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐