Char * кодировка

Если я напишу инструкцию ниже на C++ в Visual Studio,что будет кодировать здесь?

const char *c = "£";

в настройках проекта Visual Studio я установил для " кодировки "значение"не установлено".

2 ответов


установка кодировки в 'Not Set' просто означает, что ни один из макросов препроцессора _UNICODE и _MBCS не будет установлен. Это не влияет на то, какие наборы символов используются компилятором.

двумя параметрами, определяющими, как байты вашего источника преобразуются в строковый литерал в программе, являются "исходный набор символов" и "набор символов выполнения". Компилятор преобразует строковые литералы из исходной кодировки в выполнение кодирование.

исходная кодировка:

исходная кодировка-это кодировка, используемая компилятором для интерпретации байтов исходного файла. Это относится не только к строковым и символьным литералам, но и ко всему остальному в источнике, включая, например, идентификаторы.

если компилятор Visual Studio обнаруживает "подпись" Unicode в исходном файле, он будет использовать соответствующую кодировку Unicode в качестве исходной кодировки. В противном случае он будет использовать кодовую страницу системы кодирование как исходное кодирование.

выполнение кодирование:

кодировка выполнения-это кодировка, в которой компилятор хранит строковые и символьные литералы, так что строковые и символьные данные, созданные литералами, будут кодироваться с помощью кодировки выполнения.

компилятор Visual Studio использует кодовую страницу системы в качестве кодировки выполнения.


когда Visual Studio выполняет преобразование строковых и символьных литералов данные исходная кодировка для кодировки выполнения заменит символы, которые не могут быть представлены в наборе кодировок выполнения на '?'.

вот пример:

const char *c = "£";

предполагая, что ваш источник сохраняется с использованием формата Microsoft "UTF-8 с подписью", и ваша система использует CP1252, как и большинство систем на Западе, строковый литерал будет преобразован в:

0xA3 0x00

С другой стороны, если кодировка выполнения-это то, что не включает '£', например, cp1251 (кириллица, используемая в русской локали окна), тогда строковый литерал закончится:

0x3F 0x00

если вы хотите избежать зависимости от кодировки исходного кода, Вы можете использовать универсальные имена символов (UCNs):

const char *c = "\u00A3"; // "£"

если вы хотите гарантировать представление UTF-8, Вам также необходимо избежать зависимости от кодировки выполнения. Вы можете сделать это, вручную кодируя его:

const char *c = "\xC2\xA3"; // UTF-8 encoding of "£"

C++11 вводит строковые литералы UTF-8, которые будут лучше когда ваш компилятор поддерживает их:

const char *c = u8"£";

или

const char *c = u8"\u00A3"; // "£"

поскольку VS2015 update 2, теперь есть новые опции для управления этим,ссылка. Вот соответствующая цитата:

"существует также параметр / utf-8, который является синонимом настройки "/ source-charset:utf-8" и "/execution-charset: utf-8"."