Как использовать массивы символов utf8 в С++?

Возможно ли иметь char * для работы с кодировкой utf8 в С++ (VC2010)?

Например, если мой исходный файл сохраняется в utf8, и я пишу что-то вроде этого:

const char* c = "aäáéöő";

Можно ли сделать это utf-8 закодированным? И если да, как можно использовать

char* c2 = new char[strlen("aäáéöő")];

для динамического выделения, если символы могут быть переменной длиной?

Ответ 1

Кодировка для строковых литералов узкого символа - это реализация, поэтому вам действительно нужно прочитать документацию (если вы ее найдете). Быстрый эксперимент показывает, что и VС++ (VC8, в любом случае), и g++ (4.4.2, во всяком случае) фактически просто копируют байты из исходного файла; строковый литерал будет в любой кодировке, которую сохранил ваш редактор. (Это явно нарушает стандарт, но, похоже, это обычная практика.)

С++ 11 имеет строковые литералы UTF-8, которые позволят вам написать u8"text" и обеспечить, чтобы "text" был закодирован в UTF-8. Но я действительно не ожидаю, что он будет работать надежно: проблема в том, что для этого компилятор должен знать, что такое кодировка вашего исходного файла. По всей вероятности, авторы компилятора будут продолжать игнорировать эту проблему, просто копируя байты из исходного файла, а достижение соответствия просто документирует, что исходный файл должен быть в UTF-8, чтобы эти функции работали.

Ответ 2

Если текст, который вы хотите поместить в строку, находится в исходном коде, убедитесь, что файл исходного кода находится в UTF-8.

Если это не сработает, попробуйте использовать \u1234 с 1234, являющимся значением кодовой точки.

Вы также можете попробовать UTF8-CPP.

Взгляните на этот ответ: Использование Unicode в исходном коде на С++

Ответ 3

См. статью MSDN, в которой говорится о преобразовании между строковыми типами (что должно дать вам примеры того, как их использовать). Типы типов, которые охватываются, включают char *, wchar_t *, _bstr_t, CComBSTR, CString, basic_string и System.String:

Как преобразовать различные типы строк

Ответ 4

Существует исправление для VisualStudio 2010 SP1, которое может помочь: http://support.microsoft.com/kb/980263.

Исправление добавляет прагму, чтобы переопределить визуальную студию управления кодировкой символов для типа char:

#pragma execution_character_set("utf-8")

Без прагмы литералы на основе char * обычно интерпретируются как кодовая страница по умолчанию (обычно 1252)

Все это должно быть заменено в конечном итоге новыми модификаторами префикса строки, заданными С++ 0x (u8, u и U для utf-8, utf-16 и utf-32 соответственно), которые в идеале будут исключены в следующей основной версии Visual Studio после 2010 года.

Ответ 5

Возможно, сохраните файл в кодировке подписи UTF-8 без спецификации.

//Save As UTF8 without BOM signature
#include<stdio.h>
#include<windows.h>
int main(){
    SetConsoleOutputCP(65001);
    char *c1 = "aäáéöő";
    char *c2 = new char[strlen("aäáéöő")];
    strcpy(c2,c1);
    printf("%s\n",c1);
    printf("%s\n",c2);
}

Результат:

 D:\Debug>program
aäáéöő
aäáéöő

Результат программы перенаправления - это действительно кодированный файл UTF8.
UTF8 file
Это компилятор - независимый ответ (скомпилируйте в Windows).
(Аналогичный вопрос.)