Подтвердить что ты не робот

Как написать std::string в текстовый файл UTF-8

Я просто хочу написать несколько простых строк в текстовый файл на С++, но я хочу, чтобы они были закодированы в UTF-8. Каков самый простой и простой способ сделать это?

4b9b3361

Ответ 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!!! Это позволяет избежать сильной головной боли при манипулировании такими строками.