1
0

Improved types of utf 16 strings

This commit is contained in:
tycho 2015-09-29 16:08:40 +01:00 committed by Mattes D
parent 899955f9e3
commit e1d5e5e165
4 changed files with 17 additions and 17 deletions

View File

@ -1835,12 +1835,12 @@ bool cConnection::HandleServerKick(void)
Reason.append(Split[4]); Reason.append(Split[4]);
Reason.push_back(0); Reason.push_back(0);
Reason.append(Split[5]); Reason.append(Split[5]);
AString ReasonBE16 = UTF8ToRawBEUTF16(Reason.data(), Reason.size()); auto ReasonBE16 = UTF8ToRawBEUTF16(Reason);
AString PacketStart("\xff"); AString PacketStart("\xff");
PacketStart.push_back(static_cast<char>((ReasonBE16.size() / 2) / 256)); PacketStart.push_back(static_cast<char>(ReasonBE16.size() / 256));
PacketStart.push_back(static_cast<char>((ReasonBE16.size() / 2) % 256)); PacketStart.push_back(static_cast<char>(ReasonBE16.size() % 256));
CLIENTSEND(PacketStart.data(), PacketStart.size()); CLIENTSEND(PacketStart.data(), PacketStart.size());
CLIENTSEND(ReasonBE16.data(), ReasonBE16.size()); CLIENTSEND(reinterpret_cast<const char *>(ReasonBE16.data()), ReasonBE16.size() * sizeof(char16_t));
return true; return true;
} }
else else

View File

@ -200,10 +200,10 @@ void cProtocolRecognizer::SendDisconnect(const AString & a_Reason)
static const int Packet = 0xff; // PACKET_DISCONNECT static const int Packet = 0xff; // PACKET_DISCONNECT
SendData(reinterpret_cast<const char *>(&Packet), 1); // WriteByte() SendData(reinterpret_cast<const char *>(&Packet), 1); // WriteByte()
AString UTF16 = UTF8ToRawBEUTF16(a_Reason.c_str(), a_Reason.length()); auto UTF16 = UTF8ToRawBEUTF16(a_Reason);
static const u_short Size = htons(static_cast<u_short>(UTF16.size() / 2)); static const u_short Size = htons(static_cast<u_short>(UTF16.size()));
SendData(reinterpret_cast<const char *>(&Size), 2); // WriteShort() SendData(reinterpret_cast<const char *>(&Size), 2); // WriteShort()
SendData(UTF16.data(), UTF16.size()); // WriteString() SendData(reinterpret_cast<const char *>(UTF16.data()), UTF16.size() * sizeof(char16_t)); // WriteString()
} }
} }

View File

@ -500,13 +500,13 @@ static bool isLegalUTF8(const unsigned char * source, int length)
AString UTF8ToRawBEUTF16(const char * a_UTF8, size_t a_UTF8Length) std::u16string UTF8ToRawBEUTF16(const AString & a_UTF8)
{ {
AString UTF16; std::u16string UTF16;
UTF16.reserve(a_UTF8Length * 3); UTF16.reserve(a_UTF8.size() * 2);
const unsigned char * source = reinterpret_cast<const unsigned char *>(a_UTF8); const unsigned char * source = reinterpret_cast<const unsigned char *>(a_UTF8.data());
const unsigned char * sourceEnd = source + a_UTF8Length; const unsigned char * sourceEnd = source + a_UTF8.size();
const int halfShift = 10; // used for shifting by 10 bits const int halfShift = 10; // used for shifting by 10 bits
const unsigned int halfBase = 0x0010000UL; const unsigned int halfBase = 0x0010000UL;
const unsigned int halfMask = 0x3ffUL; const unsigned int halfMask = 0x3ffUL;
@ -546,13 +546,13 @@ AString UTF8ToRawBEUTF16(const char * a_UTF8, size_t a_UTF8Length)
ch = ' '; ch = ' ';
} }
unsigned short v = htons(static_cast<unsigned short>(ch)); unsigned short v = htons(static_cast<unsigned short>(ch));
UTF16.append(reinterpret_cast<const char *>(&v), 2); UTF16.push_back(static_cast<char16_t>(v));
} }
else if (ch > UNI_MAX_UTF16) else if (ch > UNI_MAX_UTF16)
{ {
// Invalid value, replace with a space // Invalid value, replace with a space
unsigned short v = htons(' '); unsigned short v = htons(' ');
UTF16.append(reinterpret_cast<const char *>(&v), 2); UTF16.push_back(static_cast<char16_t>(v));
} }
else else
{ {
@ -560,8 +560,8 @@ AString UTF8ToRawBEUTF16(const char * a_UTF8, size_t a_UTF8Length)
ch -= halfBase; ch -= halfBase;
unsigned short v1 = htons((ch >> halfShift) + UNI_SUR_HIGH_START); unsigned short v1 = htons((ch >> halfShift) + UNI_SUR_HIGH_START);
unsigned short v2 = htons((ch & halfMask) + UNI_SUR_LOW_START); unsigned short v2 = htons((ch & halfMask) + UNI_SUR_LOW_START);
UTF16.append(reinterpret_cast<const char *>(&v1), 2); UTF16.push_back(static_cast<char16_t>(v1));
UTF16.append(reinterpret_cast<const char *>(&v2), 2); UTF16.push_back(static_cast<char16_t>(v2));
} }
} }
return UTF16; return UTF16;

View File

@ -82,7 +82,7 @@ extern void ReplaceString(AString & iHayStack, const AString & iNeedle, const AS
extern AString & RawBEToUTF8(const char * a_RawData, size_t a_NumShorts, AString & a_UTF8); extern AString & RawBEToUTF8(const char * a_RawData, size_t a_NumShorts, AString & a_UTF8);
/** Converts a UTF-8 string into a UTF-16 BE string. */ /** Converts a UTF-8 string into a UTF-16 BE string. */
extern AString UTF8ToRawBEUTF16(const char * a_UTF8, size_t a_UTF8Length); extern std::u16string UTF8ToRawBEUTF16(const AString & a_String);
/** Creates a nicely formatted HEX dump of the given memory block. /** Creates a nicely formatted HEX dump of the given memory block.
Max a_BytesPerLine is 120. */ Max a_BytesPerLine is 120. */