Konsola serwera nie czyta polskich znaczków z XMLa

0

Witam
Prowadzę OTS (Open Tibia Server). Tibii nienawidzę, ale samo tworzenie serwera to fajna sprawa + zarobek + nauka. Trochę już załapałem C++ (mam źródła serwera i ciągle grzebię, kombinuję, patrzę, co gdzie jest, czemu tam i czemu tak) i mam w związku z tym problem.

Spolszczam serwer, nadaję przedmiotom nazwy polskie, lecz zamiast np. "nóż" muszę wpisać "noz" bo pisze podczas włączania serwera, że w pliku items.xml jest znak niezgodny z UTF-8 i serwer przestaje wczytywać jakiekolwiek przedmioty i każde zamiast nazwy to "Przedmiot typu ...id_przedmiotu".

Trochę grzebałem przy źródle i znalazłem tam coś takiego:

Tools.cpp

bool readXMLInteger(xmlNodePtr node, const char* tag, int32_t& value)
{
	char* nodeValue = (char*)xmlGetProp(node, (xmlChar*)tag);
	if(nodeValue)
	{
		value = atoi(nodeValue);
		xmlFreeOTSERV(nodeValue);
		return true;
	}

	return false;
}

#if (defined __WINDOWS__ || defined WIN32) && !defined __GNUC__
bool readXMLInteger(xmlNodePtr node, const char* tag, int32_t& value)
{
	char* nodeValue = (char*)xmlGetProp(node, (xmlChar*)tag);
	if(nodeValue)
	{
		value = atoi(nodeValue);
		xmlFreeOTSERV(nodeValue);
		return true;
	}

	return false;
}
#endif

bool readXMLInteger64(xmlNodePtr node, const char* tag, uint64_t& value)
{
	char* nodeValue = (char*)xmlGetProp(node, (xmlChar*)tag);
	if(nodeValue)
	{
		value = ATOI64(nodeValue);
		xmlFreeOTSERV(nodeValue);
		return true;
	}

	return false;
}

bool readXMLFloat(xmlNodePtr node, const char* tag, float& value)
{
	char* nodeValue = (char*)xmlGetProp(node, (xmlChar*)tag);
	if(nodeValue)
	{
		value = atof(nodeValue);
		xmlFreeOTSERV(nodeValue);
		return true;
	}

	return false;
}

bool utf8ToLatin1(char* intext, std::string& outtext)
{
	outtext = "";

	if(intext == NULL)
		return false;

	int32_t inlen  = strlen(intext);
	if(inlen == 0)
		return false;

	int32_t outlen = inlen * 2;
	unsigned char* outbuf = new uint8_t[outlen];
	int32_t res = UTF8Toisolat1(outbuf, &outlen, (unsigned char*)intext, &inlen);
	if(res < 0)
	{
		delete[] outbuf;
		return false;
	}

	outbuf[outlen] = '\0';
	outtext = (char*)outbuf;
	delete[] outbuf;
	return true;
}




bool readXMLString(xmlNodePtr node, const char* tag, std::string& value)
{
	char* nodeValue = (char*)xmlGetProp(node, (xmlChar*)tag);
	if(nodeValue)
	{
		if(!utf8ToLatin1(nodeValue, value))
			value = nodeValue;

		xmlFreeOTSERV(nodeValue);
		return true;
	}

	return false;
}

bool readXMLContentString(xmlNodePtr node, std::string& value)
{
	char* nodeValue = (char*)xmlNodeGetContent(node);
	if(nodeValue)
	{
		if(!utf8ToLatin1(nodeValue, value))
			value = nodeValue;

		xmlFreeOTSERV(nodeValue);
		return true;
	}

	return false;
}

tools.h

bool utf8ToLatin1(char* intext, std::string& outtext);
bool readXMLInteger(xmlNodePtr node, const char* tag, int& value);
#if (defined __WINDOWS__ || defined WIN32) && !defined __GNUC__
bool readXMLInteger(xmlNodePtr node, const char* tag, int32_t& value);
#endif
bool readXMLInteger64(xmlNodePtr node, const char* tag, uint64_t& value);
bool readXMLFloat(xmlNodePtr node, const char* tag, float& value);
bool readXMLString(xmlNodePtr node, const char* tag, std::string& value);
bool readXMLContentString(xmlNodePtr node, std::string& value);

Jeden mój znajomy mi powiedział, że mam zmienić kodowanie, inny, że zamiast char dać wchar_t a jeszcze inny, że w konsoli nie da się odczytać polskich znaczków.

W związku z tym proszę o pomoc, jak zrobić, by konsola serwera poprawnie wczytywała plik z ogonkami polskimi, albo chociaż jakiekolwiek naprowadzenie na właściwą drogę bo już z tydzień się z tym męczę, jeśli komuś potrzeba więcej danych niż te co podałem w <></> to proszę pisać...

0

Jeżeli to konsola windowsa to OemToChar(console_string, normal_string) załatwi sprawę.

0
RadekW01 napisał(a)

Witam
Prowadzę OTS (Open Tibia Server). Tibii nienawidzę, ale samo tworzenie serwera to fajna sprawa + zarobek + nauka. Trochę już załapałem C++ (mam źródła serwera i ciągle grzebię, kombinuję, patrzę, co gdzie jest, czemu tam i czemu tak) i mam w związku z tym problem.

Spolszczam serwer, nadaję przedmiotom nazwy polskie, lecz zamiast np. "nóż" muszę wpisać "noz" bo pisze podczas włączania serwera, że w pliku items.xml jest znak niezgodny z UTF-8 i serwer przestaje wczytywać jakiekolwiek przedmioty i każde zamiast nazwy to "Przedmiot typu ...id_przedmiotu".

Chce 10%
Moze sprobujesz uzyc edytora ktory obsluguje utf-8?
albo iconv -f cp1250 -t utf-8 < plik-win.xml > plik-utf8.xml

0
RadekW01 napisał(a)

[...]że w pliku items.xml jest znak niezgodny z UTF-8 i serwer przestaje wczytywać jakiekolwiek przedmioty i każde zamiast nazwy to "Przedmiot typu ...id_przedmiotu".

tutaj wystarczy zapisać plik w kodowaniu utf-8, a chyba nawet notatnik może zapisać w utf-8

RadekW01 napisał(a)

Jeden mój znajomy mi powiedział, że mam zmienić kodowanie, inny, że zamiast char dać wchar_t a jeszcze inny, że w konsoli nie da się odczytać polskich znaczków.

W związku z tym proszę o pomoc, jak zrobić, by konsola serwera poprawnie wczytywała plik z ogonkami polskimi, albo chociaż jakiekolwiek naprowadzenie na właściwą drogę bo już z tydzień się z tym męczę, jeśli komuś potrzeba więcej danych niż te co podałem w <></> to proszę pisać...

http://msdn.microsoft.com/en-us/library/ms686013.aspx
http://msdn.microsoft.com/en-us/library/ms686036.aspx
tylko musisz sobie znaleźć jaki numer tych plikczków *.nls ma utf-8

0

utf8ToLatin1
Powinieneś zamieniać na takie kodowanie, które obsługuje polskie znaki np. ISO-8859-2 (Latin2) lub Windows-1250.

A najlepiej jak po prostu zamienisz na utf-16 (wchar_t) i jego będziesz używać dalej. Wtedy nie tylko polskie znaczki obsłużysz. Tyle, że to większych przeróbek wymaga, może warto.

0
adf88 napisał(a)

utf8ToLatin1
Powinieneś zamieniać na takie kodowanie, które obsługuje polskie znaki np. ISO-8859-2 (Latin2) lub Windows-1250.

Swietny pomysl! A klient Tibii automagicznie wykryje kodowanie i automagicznie bedzie wyswietlac znaczki w tym kodowaniu.

0
.. napisał(a)
adf88 napisał(a)

utf8ToLatin1
Powinieneś zamieniać na takie kodowanie, które obsługuje polskie znaki np. ISO-8859-2 (Latin2) lub Windows-1250.

Swietny pomysl! A klient Tibii automagicznie wykryje kodowanie i automagicznie bedzie wyswietlac znaczki w tym kodowaniu.
Jak klient nie obsłuży polskich znaków to po co je w ogóle używać ? [glowa]

W Latin1 nie ma polskich znaków, więc użycie innego kodowania jest musem.

0

Klient czyta znaczki z pliku tibia.PIC a konkretnie z pliku o formacie PNG, ja już go zedytowałem i mam ogonki w moim kliencie :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1