Конвертировать в кодировку UTF8

78
14 февраля 2018, 11:46

Есть замечательный способ создать строку уже в кодировке utf8:

string str = u8"ежик"

А можно так же без лишних бубнотанцев сделать с уже готовой строкой, если я получаю её как аргумент функции?

foo("ежик");
void foo(string str) {
   ...
}

Мне просто нужно получить строку в кодировке utf8 в string либо const char*. Можно это сделать не городя огромную стену кода?

Answer 1

Не знаю насколько полезно это вам будет, но...
В моём проекте под Windows присутствуют операции с кодировками cp1251 и utf8, которые покрываются такими функциями:

1251 в utf8:

string cp1251_to_utf8(const char *str){
    string res; 
    int result_u, result_c;
    result_u = MultiByteToWideChar(1251, 0, str, -1, 0, 0);
    if(!result_u ){return 0;}
    wchar_t *ures = new wchar_t[result_u];
    if(!MultiByteToWideChar(1251, 0, str, -1, ures, result_u)){
        delete[] ures;
        return 0;
    }
    result_c = WideCharToMultiByte(65001, 0, ures, -1, 0, 0, 0, 0);
    if(!result_c){
        delete [] ures;
        return 0;
    }
    char *cres = new char[result_c];
    if(!WideCharToMultiByte(65001, 0, ures, -1, cres, result_c, 0, 0)){
        delete[] cres;
        return 0;
    }
    delete[] ures;
    res.append(cres);
    delete[] cres;
    return res;
}

Проверка на UTF8:

bool is_valid_utf8(const char * string){
    if(!string){return true;}
    const unsigned char * bytes = (const unsigned char *)string;
    unsigned int cp;
    int num;
    while(*bytes != 0x00){
        if((*bytes & 0x80) == 0x00){
            // U+0000 to U+007F 
            cp = (*bytes & 0x7F);
            num = 1;
        }
        else if((*bytes & 0xE0) == 0xC0){
            // U+0080 to U+07FF 
            cp = (*bytes & 0x1F);
            num = 2;
        }
        else if((*bytes & 0xF0) == 0xE0){
            // U+0800 to U+FFFF 
            cp = (*bytes & 0x0F);
            num = 3;
        }
        else if((*bytes & 0xF8) == 0xF0){
            // U+10000 to U+10FFFF 
            cp = (*bytes & 0x07);
            num = 4;
        }
        else{return false;}
        bytes += 1;
        for(int i = 1; i < num; ++i){
            if((*bytes & 0xC0) != 0x80){return false;}
            cp = (cp << 6) | (*bytes & 0x3F);
            bytes += 1;
        }
        if( (cp > 0x10FFFF) ||
            ((cp <= 0x007F) && (num != 1)) || 
            ((cp >= 0xD800) && (cp <= 0xDFFF)) ||
            ((cp >= 0x0080) && (cp <= 0x07FF)  && (num != 2)) ||
            ((cp >= 0x0800) && (cp <= 0xFFFF)  && (num != 3)) ||
            ((cp >= 0x10000)&& (cp <= 0x1FFFFF)&& (num != 4)) ){return false;}
    }
    return true;
}

string в wstring:

wstring string_to_wstring(string str){
    wstring convertedString;
    int requiredSize = MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, 0, 0);
    if( requiredSize > 0){
        vector<wchar_t> buffer(requiredSize);
        MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, &buffer[0], requiredSize);
        convertedString.assign(buffer.begin(), buffer.end() - 1);
    }
    return convertedString;
}
READ ALSO
SFINAE перегрузка по сигнатуре Callable-объекта

SFINAE перегрузка по сигнатуре Callable-объекта

Ребята, помогите написать перегруженную функцию, которая принимает на вход произвольный Callable объект:

79
Подключение cpp файла

Подключение cpp файла

Работаю в visual studioНашел библиотеку с большими числами:bigint, но не понимаю как ее правильно подключить и использовать

33
Стили в Qt применяются не корректно

Стили в Qt применяются не корректно

Вопрос такой, почему когда прописываю стили в таблице стилей styleqss вот таким способом, то стили не применяются:

42