Используя Unicode в исходном коде C++

53
задан Jonathan Leffler 2 May 2015 в 16:38
поделиться

7 ответов

Кодирование в 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]).

34
ответ дан vaxquis 7 November 2019 в 08:50
поделиться

В стандарте 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.
10
ответ дан Head Geek 7 November 2019 в 08:50
поделиться

В дополнение к сообщению litb MSVC ++ поддерживает Unicode также. Я понимаю, что это получает кодирование Unicode от BOM. Это определенно поддерживает код как int (*♫)(); или const std::set<int> ∅;, Если Вы действительно в код obfuscuation:

typedef void ‼; // Also known as \u203C
class ooɟ {
    operator ‼() {}
};
9
ответ дан MSalters 7 November 2019 в 08:50
поделиться

Здесь существует две проблемы в действии. Первое - то, какие символы позволяются в коде C++ (и комментарии), такие как имена переменной. Второе - то, какие символы позволяются в строках и строковых литералах.

, Как отмечено, компиляторы C++ должны поддерживать очень ограниченный основанный на ASCII набор символов для символов, позволенных в коде и комментариях. На практике этот набор символов не работал очень хорошо с некоторыми европейскими наборами символов (и особенно с некоторыми европейскими клавиатурами, которые не имели нескольких символов - как квадратные скобки - доступными), таким образом, понятие диграфов и trigraphs было представлено. Много компиляторов принимают больше, чем этот набор символов в это время, но нет никакой гарантии.

Что касается строк и строковых литералов, C++ имеет понятие строки широкого символа и широкого символа. Однако кодирование для того набора символов не определено. На практике это - почти всегда Unicode, но я не думаю, что здесь существует любая гарантия. Строковые литералы широкого символа похожи на "строковый литерал" L, и они могут быть присвоены станд.:: wstring's.

<час>

C++ 11 добавил явную поддержку строк Unicode и строковых литералов, закодированных как UTF-8, обратный порядок байтов UTF-16, прямой порядок байтов UTF-16, обратный порядок байтов UTF-32 и прямой порядок байтов UTF-32.

6
ответ дан Max Lybbert 7 November 2019 в 08:50
поделиться

Для кодирования в строках я думаю, что Вы предназначены для использования нотация \u , например:

std::wstring str = L"\u20AC"; // Euro character
3
ответ дан Rob 7 November 2019 в 08:50
поделиться

Также стоит отметить, что широкие символы в 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, константы все еще определяются реализацией, хотя (и нет никакой поддержки кодирования сложных строковых типов вне литералов)

2
ответ дан coppro 7 November 2019 в 08:50
поделиться

AFAIK Это не стандартизировано, поскольку можно поместить любой тип символов в широких строках. Просто необходимо проверить, что компилятор установлен на исходный код Unicode заставить его работать правильно.

0
ответ дан Klaim 7 November 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: