Я просто хочу написать несколько простых строк в текстовый файл на С++, но я хочу, чтобы они были закодированы в UTF-8. Каков самый простой и простой способ сделать это?
Как написать std::string в текстовый файл UTF-8
Ответ 1
Единственный способ, которым UTF-8 влияет на std::string
, заключается в том, что size()
, length()
, и все индексы измеряются в байтах, а не в символах.
И, как указывает sbi, приращение итератора, предоставляемого std::string
, будет шаг за шагом байтом, а не символом, поэтому оно может фактически указывать на середину многобайтового кодового пункта UTF-8. Там нет итератора с поддержкой UTF-8, предоставленного в стандартной библиотеке, но есть несколько доступных в "Сети".
Если вы это помните, вы можете поместить UTF-8 в std::string
, записать его в файл и т.д. все обычным способом (под которым я имею в виду то, как вы используете std::string
без UTF- 8 внутри).
Возможно, вы захотите запустить свой файл с байтом, чтобы другие программы знали, что это UTF-8.
Ответ 2
Существует хорошая крошечная библиотека для работы с utf8 из С++: utfcpp
Ответ 3
libiconv - отличная библиотека для всех наших потребностей в кодировании и декодировании.
Если вы используете Windows, вы можете использовать WideCharToMultiByte и указать, что вы хотите UTF8.
Ответ 4
Какой самый простой и простой способ сделать это?
Наиболее интуитивно понятная и, следовательно, самая простая обработка utf8 в C++ наверняка использует вставную замену для std::string
. Так как в интернете его еще нет, я решил реализовать эту функцию самостоятельно:
tinyutf8 (РЕДАКТИРОВАТЬ: теперь Github).
Эта библиотека предоставляет очень легкую вставку для std::string
(или, если хотите, std::u32string
, потому что вы перебираете кодовые точки, а не символы). Ity успешно реализован в середине между быстрым доступом и небольшим потреблением памяти, при этом будучи очень надежным. Эта устойчивость к "недопустимым" UTF8-последовательностям делает его (почти полностью) совместимым с ANSI (0-255).
Надеюсь это поможет!
Ответ 5
Если под "простым" вы подразумеваете ASCII, нет необходимости делать какую-либо кодировку, так как символы с ASCII значением 127 или менее одинаковы в UTF-8.
Ответ 6
std::wstring text = L"Привет";
QString qstr = QString::fromStdWString(text);
QByteArray byteArray(qstr.toUtf8());
std::string str_std( byteArray.constData(), byteArray.length());
Ответ 7
Я предпочитаю конвертировать в и из std :: u32string и работать с внутренними кодовыми точками, а затем конвертировать в utf8 при записи в файл, используя эти итераторы преобразования, которые я установил на github.
Ответ 8
Использовать Glib:: ustring из glibmm.
Это единственный широко распространенный контейнер строки UTF-8 (AFAIK). Хотя на основе глифа (не байт) он имеет те же сигнатуры методов, что и std::string
, поэтому порт должен быть простым поиском и заменой (просто убедитесь, что ваши данные действительны UTF-8 перед загрузкой в ustring
).
Ответ 9
Что касается UTF-8, это многобитовая строка символов, и поэтому у вас возникают проблемы, и это плохая идея/Вместо этого используется обычный Unicode.
Так что, по моему мнению, лучше всего использовать обычный текст ASCII char с некоторым набором кодировок. Необходимо использовать Unicode, если вы используете более двух наборов разных символов (языки) в одном.
Это довольно редкий случай. В большинстве случаев достаточно 2 наборов символов. Для этого общего случая используйте символы ASCII, а не Unicode.
Эффект использования многообразных символов, таких как UTF-8, вы получаете только традиционный китайский, арабский или иероглифический текст. Это очень редкий случай!!!
Я не думаю, что многие люди нуждаются в этом. Поэтому никогда не используйте UTF-8!!! Это позволяет избежать сильной головной боли при манипулировании такими строками.