Jump to content
Karbust

Problema com conversão String para HEX em UTF8

Recommended Posts

Karbust

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

Share this post


Link to post
Share on other sites
HappyHippyHippo

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

Share this post


Link to post
Share on other sites
Karbust
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);

 

  • Vote 1

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.