• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!
  • 2026 staff recruitment is open! Check it out and consider applying!

Solução para tfs 1.5 aceitar acentuações sem precisa salvar como ansi

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:

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
 
Back
Top