Karbust 2 Posted August 24, 2019 Report Share Posted August 24, 2019 Boa noite, Estou aqui a tentar guardar um log do chat de um jogo. A função em si funciona corretamente, mas a conversão de uma string para hexadecimal caso tenha acentos não funciona como era suposto. A função funcionaria corretamente se fosse para converter para ANSI, mas estou a tentar guardar em UTF8 (o website em PHP faz UNHEX e devolve a string mantendo os carateres acentuados). A função é esta: std::string string_to_hex(const std::string& input) { static const char* const lut = "0123456789ABCDEF"; size_t len = input.length(); std::string output; output.reserve(2 * len); for (size_t i = 0; i < len; ++i) { const unsigned char c = input[i]; output.push_back(lut[c >> 4]); output.push_back(lut[c & 15]); } return output; } Os ficheiros estão com a codificação definida para UTF8. A mesma função no projeto de teste que fiz (apenas para esta função) devolve o correto em UTF8. Exemplo do projeto de testes: String: áéèàóòãâ Hex: C3A1C3A9C3A8C3A0C3B3C3B2C3A3C3A2 Exemplo do projeto de testes mas com o ficheiro cpp codificado em ANSI: String: áéèàóòãâ Hex: E1E9E8E0F3F2E3E2 Exemplo da mesma string mas no projeto principal (os 3 ficheiros codificados em UTF8): String: áéèàóòãâ Hex: E1E9E8E0F3F2E3E2 Projeto de testes (compilado com gcc8 em FreeBSD): #include <algorithm> #include <stdexcept> #include <string> #include<iostream> using namespace std; std::string string_to_hex(const std::string& input) { static const char* const lut = "0123456789ABCDEF"; size_t len = input.length(); std::string output; output.reserve(2 * len); for (size_t i = 0; i < len; ++i) { const unsigned char c = input[i]; output.push_back(lut[c >> 4]); output.push_back(lut[c & 15]); } return output; } std::string hex_to_string(const std::string& input) { static const char* const lut = "0123456789ABCDEF"; size_t len = input.length(); if (len & 1) throw std::invalid_argument("odd length"); std::string output; output.reserve(len / 2); for (size_t i = 0; i < len; i += 2) { char a = input[i]; const char* p = std::lower_bound(lut, lut + 16, a); if (*p != a) throw std::invalid_argument("not a hex digit"); char b = input[i + 1]; const char* q = std::lower_bound(lut, lut + 16, b); if (*q != b) throw std::invalid_argument("not a hex digit"); output.push_back(((p - lut) << 4) | (q - lut)); } return output; } int main() { std::string input = "áéèàóòãâ"; cout<<string_to_hex(input)<<"\n"; cout<<hex_to_string(string_to_hex(input))<<"\n"; return 0; } Link: http://cpp.sh/37wtx Alguém tem alguma ideia de qual possa ser o problema? Obrigado Link to post Share on other sites
HappyHippyHippo 1,162 Posted September 4, 2019 Report Share Posted September 4, 2019 a execução desse código no link que colocaste resultou no que indicas ser o resultado pretendido IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to post Share on other sites
Karbust 2 Posted September 4, 2019 Author Report Share Posted September 4, 2019 3 horas atrás, HappyHippyHippo disse: a execução desse código no link que colocaste resultou no que indicas ser o resultado pretendido Eu sei. Em 25/08/2019 às 00:24, Karbust disse: Os ficheiros estão com a codificação definida para UTF8. A mesma função no projeto de teste que fiz (apenas para esta função) devolve o correto em UTF8. Exemplo do projeto de testes: String: áéèàóòãâ Hex: C3A1C3A9C3A8C3A0C3B3C3B2C3A3C3A2 Exemplo do projeto de testes mas com o ficheiro cpp codificado em ANSI: String: áéèàóòãâ Hex: E1E9E8E0F3F2E3E2 Exemplo da mesma string mas no projeto principal (os 3 ficheiros codificados em UTF8): String: áéèàóòãâ Hex: E1E9E8E0F3F2E3E2 Eu referi isso Já corrigi o erro. Mantive a inserir como string normal e no PHP faço a conversão. iconv(mb_detect_encoding($text, mb_detect_order(), true), "UTF-8", $text); 1 Report Link to post Share on other sites
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now