Преобразование специальных символов (UTF-8) - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь преобразовать символы à с помощью #include <iconv.h>, но получаю мусор �.

Это код

#include <stdio.h>
#include <string.h>
#include <iconv.h>
#include <iostream>

int main()
{
    char *gbk_str = "àèì asdsa sd aä";
    char dest_str[100];
    char *out = dest_str;
    size_t inbytes = strlen(gbk_str);
    size_t outbytes = sizeof dest_str;
    iconv_t conv = iconv_open("ISO8859-1", "UTF-8");

    if (conv == (iconv_t)-1) {
        std::cout <<"iconv_open";
        return 1;
    }

    if (iconv(conv, &gbk_str, &inbytes, &out, &outbytes) == (size_t)-1) {
        std::cout << "iconv";
        return 1;
    }

    dest_str[sizeof dest_str - outbytes] = 0;
    puts(dest_str);
    return 0;
}

Вернитесь с: Итальянский символ: POLS 6000 Impianto riduzione d. velocità

байтовая кодировка: 50 4f 4 c 53 20 36 30 30 30 20 49 6d 70 69 61 6e 74 6f 20 72 69 64 75 7a 69 6f 6e 65 20 64 2e 20 76 65 6 c 6f 63 69 74 c3 a0

Преобразовано: POLS 6000 Impianto riduzione d. velocità -> POLS 6000 Impianto riduzione d. velocit340

1 Ответ

0 голосов
/ 09 июля 2020

Вы должны установить кодировку символов терминала ISO8859-1. В моем Linux терминале Mate это:

Терминал >> Установить кодировку символов >> Центрально-европейский (WINDOWS -1250)

Затем я смог увидеть правильный вывод из ваша программа. Без этого изменения это действительно была фигня.

...