Как использовать массивы символов utf8 в c ++? - PullRequest
13 голосов
/ 20 мая 2011

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

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

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

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

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

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

Ответы [ 5 ]

13 голосов
/ 20 мая 2011

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

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

4 голосов
/ 20 мая 2011

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

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

Вы также можете попробовать использовать UTF8-CPP возможно.

Посмотрите на этот ответ: Использование Unicode в C ++, исходный код

2 голосов
/ 29 сентября 2013

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

1 голос
/ 18 июня 2011

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

Исправление добавляет прагму для переопределения управления Visual Studio кодировкой символов для типа символа:

#pragma execution_character_set("utf-8")

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

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

1 голос
/ 20 мая 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...