Кодирование в C++ является вполне немного сложным. Вот мое понимание его.
Каждая реализация должна поддерживать символы от базовый набор символов исходного кода . Они включают обычные символы, перечисленные в В§2.2/1 (В§2.3/1 в C++ 11). Эти символы должны все вписаться в один char
. Кроме того, реализации должны поддерживать способ назвать другие символы с помощью пути, названного universal-character-names
и похожими \uffff
или \Uffffffff
, и могут использоваться для обращения к символам Unicode. Подмножество их применимо в идентификаторах (перечисленный в Приложении E).
Это все хорошо, но отображение от символов в файле, к исходным символам (используемый во время компиляции) является определенной реализацией. Это составляет используемое кодирование. Вот то, что это говорит буквально (C++ 98 версий):
Физические символы исходного файла отображаются, определенным реализацией способом, к базовому набору символов исходного кода (представляющий символы новой строки для индикаторов конца строки) при необходимости. Последовательности Trigraph (2.3) заменяются соответствующим отдельным символом внутренние представления. Любой символ исходного файла не в базовом наборе символов исходного кода (2.2) заменяется универсальным именем персонажа, что des-зажигает тот символ. (Реализация может использовать любое внутреннее кодирование, пока фактический расширенный символ, с которым встречаются в исходном файле и том же расширенном символе, выраженном в исходном файле как универсальное имя персонажа (т.е. использование \uXXXX нотации), обрабатывается эквивалентно.)
Для gcc, можно изменить его с помощью опции -finput-charset=charset
. Кроме того, можно измениться, символ выполнения раньше повторно задавал значения во времени выполнения. Надлежащая опция для этого -fexec-charset=charset
для символа (это принимает значение по умолчанию к utf-8
), и -fwide-exec-charset=charset
(который значения по умолчанию или к utf-16
или к utf-32
в зависимости от размера [1 110]).
В стандарте C++ ничто не говорится о кодировании файла исходного кода, насколько я знаю.
обычное кодирование (или используется, чтобы быть) 7-разрядный ASCII - некоторые компиляторы (Borland, например) передумали бы относительно символов ASCII, которые использовали высоко-разрядное. Нет никакой технической причины, что символы Unicode не могут использоваться, если Ваш компилятор и редактор принимают их - большинство современных основанных на Linux инструментов и многие лучшие редакторы на базе Windows, обрабатывают кодировку UTF-8 без проблемы, хотя я не уверен, что компилятор Microsoft будет.
РЕДАКТИРОВАНИЕ: похоже, что компиляторы Microsoft примут закодированные Unicode файлы, но будут иногда производить ошибки на 8-разрядном ASCII также:
warning C4819: The file contains a character that cannot be represented
in the current code page (932). Save the file in Unicode format to prevent
data loss.
В дополнение к сообщению litb MSVC ++ поддерживает Unicode также. Я понимаю, что это получает кодирование Unicode от BOM. Это определенно поддерживает код как int (*♫)();
или const std::set<int> ∅;
, Если Вы действительно в код obfuscuation:
typedef void ‼; // Also known as \u203C
class ooɟ {
operator ‼() {}
};
Здесь существует две проблемы в действии. Первое - то, какие символы позволяются в коде C++ (и комментарии), такие как имена переменной. Второе - то, какие символы позволяются в строках и строковых литералах.
, Как отмечено, компиляторы C++ должны поддерживать очень ограниченный основанный на ASCII набор символов для символов, позволенных в коде и комментариях. На практике этот набор символов не работал очень хорошо с некоторыми европейскими наборами символов (и особенно с некоторыми европейскими клавиатурами, которые не имели нескольких символов - как квадратные скобки - доступными), таким образом, понятие диграфов и trigraphs было представлено. Много компиляторов принимают больше, чем этот набор символов в это время, но нет никакой гарантии.
Что касается строк и строковых литералов, C++ имеет понятие строки широкого символа и широкого символа. Однако кодирование для того набора символов не определено. На практике это - почти всегда Unicode, но я не думаю, что здесь существует любая гарантия. Строковые литералы широкого символа похожи на "строковый литерал" L, и они могут быть присвоены станд.:: wstring's.
<час>C++ 11 добавил явную поддержку строк Unicode и строковых литералов, закодированных как UTF-8, обратный порядок байтов UTF-16, прямой порядок байтов UTF-16, обратный порядок байтов UTF-32 и прямой порядок байтов UTF-32.
Для кодирования в строках я думаю, что Вы предназначены для использования нотация \u , например:
std::wstring str = L"\u20AC"; // Euro character
Также стоит отметить, что широкие символы в C++ не являются действительно строками Unicode как таковыми. Они - просто строки больших символов, обычно 16, но иногда 32 бита. Это определяется реализацией, тем не менее, IIRC, у Вас может быть 8-разрядное wchar_t
, у Вас нет реальной гарантии относительно кодирования в них, поэтому при попытке сделать что-то как обработка текста, Вы, вероятно, захотите определение типа к самому подходящему целому типу к Вашему объекту Unicode.
C++ 1x имеет дополнительную поддержку unicode в форме строковых литералов кодировки UTF-8 (u8"text"
), и UTF-16 и типы данных UTF-32 (char16_t
и char32_t
IIRC), а также соответствующие строковые константы (u"text"
и U"text"
). Кодирование на символах определило без \uxxxx
или \Uxxxxxxxx
, константы все еще определяются реализацией, хотя (и нет никакой поддержки кодирования сложных строковых типов вне литералов)
AFAIK Это не стандартизировано, поскольку можно поместить любой тип символов в широких строках. Просто необходимо проверить, что компилятор установлен на исходный код Unicode заставить его работать правильно.