Как использовать массивы символов 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).
(Аналогичный вопрос.)