Преобразовать std :: string из UTF8, UTF16, ISO88591 в шестнадцатеричный - PullRequest
0 голосов
/ 28 октября 2019

Я пытаюсь кодировать std :: string из UTF8, ... в шестнадцатеричное. Что я не могу сделать сейчас, так это то, что я не могу получить десятичное значение каждого символа входной строки для его преобразования, если входная строка содержит специальный символ, который из идентификаторов кодовой страницы (windows-1258) включает вьетнамский символ,

Сначала я получу десятичное значение, а затем преобразую его в двоичное, а затем в шестнадцатеричное. s - моя входная строка. s = "Ồ".

void StringUtils::strToBinary(wstring s, string* result)
{
    int n = s.length();
    for (int i = 0; i < n; i++)
    {
        wchar_t c = s[i];
        long val = long(c);
        std::string bin = "";
        while (val > 0)
        {
            (val % 2) ? bin.push_back('1') :
                bin.push_back('0');
            val /= 2;
        }
        reverse(bin.begin(), bin.end());
        result->append(convertBinToHex(bin));
    }
}

std::string StringUtils::convertBinToHex(std::string temp) {
    long long binaryValue = atoll(temp.c_str());
    long long dec_value = 0;
    int base = 1;
    int i = 0;


    while (binaryValue) {
        long long last_digit = binaryValue % 10;

        binaryValue = binaryValue / 10;

        dec_value += last_digit * base;

        base = base * 2;

    }
    char hexaDeciNum[10];
    while (dec_value != 0)
    {
        int temp = 0;
        temp = dec_value % 16;
        if (temp < 10)
        {
            hexaDeciNum[i] = temp + 48;
            i++;
        }
        else
        {
            hexaDeciNum[i] = temp + 55;
            i++;
        }
        dec_value = dec_value / 16;
    }
    std::string str;
    for (int j = i - 1; j >= 0; j--) {
        str = str + hexaDeciNum[j];
    }
    return str;
}

Если мои входные данные содержат только "Ồ", это то, что я ожидал получить

UTF8 : E1BB92
UTF16 : FEFF 1ED2
UTF16BE : 1ED2
UTF16LE : D21E

Так я делаю это в Java

    Charset charset = Charset.forName(Enum.valueOf(Encoding.class, encodingType).toString());
    ByteBuffer buffer = charset.newEncoder().encode(CharBuffer.wrap(inputString.toCharArray()));
    byte[] bytes = new byte[buffer.limit()];
    buffer.get(bytes, 0, buffer.limit());
    result = new ByteField(bytes);
    return result;
            } 
...