@MayRiv

Как сконвертировать UTF-8 в Windows-1251 с транслитерацией iconv-ом?

У меня не получается сконвертировать с помощью программы на плюсах строку "aÜ" с транслитерацией, результирующая строка - "a?", а желаемая - "aU"
В то время как когда я использую php скрипт на той же машине, "<?php echo iconv("UTF-8", "Windows-1251//TRANSLIT", "Ü");>", всё работает нормально.
Чем может быть вызвана ошибка?

Текст программы:
#include <cstdlib>
#include <iconv.h>
#include <locale.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
using namespace std;

int IConvert(char *buf, size_t len, const char *from, const char *to)
{
	iconv_t iconv_cd;
	if ((iconv_cd = iconv_open(to, from)) == (iconv_t) -1) {
		printf("Cannot open iconv from %s to %s\n", from, to);
		return 0;
	}

	char *inbuf = buf;
	char *outbuf = buf;
	size_t inlen = len;
	size_t outlen = len;
	size_t res = 0;

	while (inlen > 0 && outlen > 0) {
		res = iconv(iconv_cd, &inbuf, &inlen, &outbuf, &outlen);
		if (res == 0)
			break;

		if (res == (size_t) (-1)) {
			if (errno != EILSEQ && errno != EINVAL) {
				iconv_close(iconv_cd);
				*outbuf = '\0';
				printf("Erorr %s (%s)\n", strerror(errno), from);

				return 0;
			} else if (inbuf < outbuf) {
				iconv_close(iconv_cd);
				*outbuf = '\0';
				printf("Erorr %s (inbuf < outbuf)\n", strerror(errno));

				return 0;
			}
		}
		if (inlen > 0 && outlen > 0) {
			*outbuf++ = *inbuf++;
			inlen--;
			outlen--;
		}
	}
	iconv_close(iconv_cd);
	*outbuf = '\0';
	return 1;
}
int main(int argc, char** argv) {
        char* from = "aÜ";
        char* to = (char*) malloc(strlen(from)+1);
        strcpy(to, from);
        IConvert(to, strlen(from)+1, "UTF-8", "CP1251//TRANSLIT");
        
        printf("%s\n", to);
    return 0;
}
  • Вопрос задан
  • 1559 просмотров
Решения вопроса 1
@MayRiv Автор вопроса
Подсказали на стековерфлоу, проблему полностью решает функция
setlocale(LC_ALL, ""); в начале программы.

Почему - я ещё буду гуглить.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы