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"."