Вопрос совершенно неясен. Чтобы кодировать что-то, вам нужен вход, верно? Поэтому, когда вы говорите "Кодировка вьетнамского символа в UTF8, UTF16" какая у вас строка ввода и какая кодировка перед преобразованием в UTF-8/16? Как вы вводите это? Из файла или консоли?
И с какой стати вы конвертируете в двоичный файл, а затем в шестнадцатеричный? Вы можете печатать непосредственно в двоичном и шестнадцатеричном виде из байтов, не нужно преобразовывать двоичный код в шестнадцатеричный. Обратите внимание, что преобразование в двоичный код - это хорошо для тестирования, но в производственном коде оно неэффективно. Я также не знаю, что вы подразумеваете под «Но что, если мое письмо будет« Á »или« А », которое является вьетнамским, я не могу получить его значение» . Пожалуйста, покажите минимальный воспроизводимый пример вместе с вводом / выводом
Но я думаю, что вы просто хотите вывести байты в кодировке UTF из строкового литерала в исходном коде, например "Аа». В этом случае это не называется «кодирование строки», а просто «вывод строки»
И Á
, и À
в Юникоде могут быть представлены предварительно составленными символами (U+ 00C1 и U + 00C0) или комбинация символов (A + U + 0301 /́ / U + 0300 ◌̀). Вы можете переключаться между ними, выбирая "Unicode dựng sẵn" или "Unicode tổ hợp" в Unikey. Предположим, у вас есть эти символы в строковом литеральном формате, тогда std::string str = "ÁÀ"
содержит серию байтов, которая соответствует вышеуказанным буквам в кодировке исходного файла. Поэтому в зависимости от того, в какой кодировке вы сохраняете файл * .cpp как (CP1252, CP1258, UTF-8 ...), значения выходных байтов будут разными
Для принудительного кодирования UTF-8/16/32просто необходимо использовать суффикс u8
, u
и U
соответственно, вместе с правильным типом (char8_t
, char16_t
, char32_t
или std::u8string
/ std::u16string
/ std::u32string
)
std::u8string utf8 = u8"ÁÀ";
std::u16string utf16 = u"ÁÀ";
std::u32string utf32 = U"ÁÀ";
Затем просто используйте c_str()
, чтобы получить базовые буферы и распечатать байты. В C ++ 14 std::u8string
пока недоступен, поэтому просто сохраните файл как UTF-8 и используйте std::string
. Точно так же вы можете прочитать std::u*string
непосредственно из std::cin
, чтобы напечатать кодировку введенной пользователем строки
Редактировать:
Для преобразования между кодировками UTF используйте стандарт std::codecvt
, std::wstring_convert
, std::codecvt_utf8_utf16
...
Работать с кодировками, отличными от Unicode, сложнее и требует некоторой внешней библиотеки, такой как ICU или OS-зависимые API
Ограничение ISO-8859-1 упрощает эту задачу, но вам все еще нужно много справочных таблиц, и невозможно преобразовать другие кодировки в ASCII без потери информации