andredede
New Member
- Joined
- Jun 17, 2019
- Messages
- 17
- Reaction score
- 3
Estou trazendo uma solução para o tfs 1.5 aceitar os caracter com acentuação sem a necessidade de ter que ficar salvando como ansi ou western.
O client cip 8.6 e otc recebe a formatação latin1, o que eu fiz foi converter de utf8 para latin1 antes de enviar. assim fazendo funcionar as acentuações:
criei essa funçaõ dentro de networkmessage.cpp
e alterei a função de addstring:
só compilar e testar
O client cip 8.6 e otc recebe a formatação latin1, o que eu fiz foi converter de utf8 para latin1 antes de enviar. assim fazendo funcionar as acentuações:
LUA:
static std::string utf8ToLatin1(std::string_view utf8String)
{
std::string result;
result.reserve(utf8String.size());
for (size_t i = 0; i < utf8String.size(); ++i) {
unsigned char c = static_cast<unsigned char>(utf8String[i]);
// ASCII puro (0-127)
if (c < 0x80) {
result += c;
}
// Sequência UTF-8 de 2 bytes
else if ((c & 0xE0) == 0xC0 && i + 1 < utf8String.size()) {
unsigned char c2 = static_cast<unsigned char>(utf8String[++i]);
unsigned int codepoint = ((c & 0x1F) << 6) | (c2 & 0x3F);
// Codepoint está dentro do range Latin1 (0-255)
if (codepoint <= 0xFF) {
result += static_cast<char>(codepoint);
} else {
result += '?'; // Caractere não suportado em Latin1
}
}
// Sequência UTF-8 de 3 bytes
else if ((c & 0xF0) == 0xE0 && i + 2 < utf8String.size()) {
// Pula os próximos 2 bytes e substitui por '?'
i += 2;
result += '?';
}
// Sequência UTF-8 de 4 bytes
else if ((c & 0xF8) == 0xF0 && i + 3 < utf8String.size()) {
// Pula os próximos 3 bytes e substitui por '?'
i += 3;
result += '?';
}
// Byte inválido
else {
result += '?';
}
}
return result;
}
criei essa funçaõ dentro de networkmessage.cpp
e alterei a função de addstring:
LUA:
void NetworkMessage::addString(std::string_view value)
{
std::string latin1String = utf8ToLatin1(value);
size_t stringLen = latin1String.length();
if (!canAdd(stringLen + 2) || stringLen > 8192) {
return;
}
add<uint16_t>(stringLen);
std::memcpy(buffer.data() + info.position, latin1String.data(), stringLen); // AQUI! Mudei de value.data() para latin1String.data()
info.position += stringLen;
info.length += stringLen;
}
só compilar e testar