Как записать std :: string в текстовый файл UTF-8 - PullRequest
57 голосов
/ 10 июня 2010

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

Ответы [ 9 ]

55 голосов
/ 10 июня 2010

Единственный способ, которым UTF-8 влияет на std::string, - это size(), length(), и все индексы измеряются в байтах, а не в символах.

И, как указывает sbi, приращение итератора, предоставляемого std::string, будет продвигаться вперед по байту, а не по символу, поэтому он может фактически указывать на середину многобайтовой кодовой точки UTF-8. В стандартной библиотеке нет итератора с поддержкой UTF-8, но в сети есть несколько доступных.

Если вы помните это, вы можете поместить UTF-8 в std::string, записать его в файл и т. Д. Как обычно (под этим я подразумеваю способ использования std::string без UTF- 8 внутри).

Возможно, вы захотите начать свой файл с метки порядка байтов, чтобы другие программы знали, что это UTF-8.

24 голосов
/ 26 марта 2013

Есть хорошая маленькая библиотека для работы с utf8 из c ++: utfcpp

10 голосов
/ 10 июня 2010

libiconv - отличная библиотека для всех наших потребностей в кодировании и декодировании.

Если вы используете Windows, вы можете использовать WideCharToMultiByte и указать, что вы хотите UTF8.

9 голосов
/ 02 декабря 2015

Какой самый простой и простой способ сделать это?

Самая интуитивно понятная и, следовательно, самая простая обработка utf8 в C ++ наверняка использует замену дляstd::string.Так как в интернете его еще нет, я решил реализовать эту функцию самостоятельно:

tinyutf8 (РЕДАКТИРОВАТЬ: теперь Github).

Эта библиотека обеспечивает очень легкую предварительную замену для std::string (или std::u32string, если хотите, потому что вы перебираете кодовые точки , а не char s).Ity успешно реализован в середине между быстрым доступом и небольшим потреблением памяти, при этом будучи очень надежным.Эта устойчивость к «недопустимым» UTF8-последовательностям делает его (почти полностью) совместимым с ANSI (0-255).

Надеюсь, это поможет!

7 голосов
/ 10 июня 2010

Если под «простым» вы подразумеваете ASCII, нет необходимости выполнять какую-либо кодировку, так как символы со значением ASCII 127 или менее одинаковы в UTF-8.

5 голосов
/ 28 июня 2013
std::wstring text = L"Привет";
QString qstr = QString::fromStdWString(text);
QByteArray byteArray(qstr.toUtf8());    
std::string str_std( byteArray.constData(), byteArray.length());
0 голосов
/ 09 декабря 2018

Я предпочитаю конвертировать в и из std :: u32string и работать с внутренними кодами, а затем конвертировать в utf8 при записи в файл, используя эти итераторы преобразования, которые я поместил на github.

#include <utf/utf.h>

int main()
{
    using namespace utf;

    u32string u32_text = U"ɦΈ˪˪ʘ";
    // do stuff with string
    // convert to utf8 string
    utf32_to_utf8_iterator<u32string::iterator> pos(u32_text.begin());
    utf32_to_utf8_iterator<u32string::iterator> end(u32_text.end());

    u8string u8_text(pos, end);

    // write out utf8 to file.
    // ...
}
0 голосов
/ 25 января 2017

Использование Glib :: ustring из glibmm .

Это единственный широко распространенный контейнер для строк UTF-8 (AFAIK).Несмотря на то, что он основан на глифе (не байтовом), он имеет те же сигнатуры методов, что и std::string, поэтому порт должен быть простым поиском и заменой (просто убедитесь, что ваши данные соответствуют UTF-8, прежде чем загружать их в ustring).

0 голосов
/ 28 июля 2013

Что касается UTF-8, это строка многобайтных символов, поэтому у вас возникают некоторые проблемы, и это плохая идея. Вместо этого используйте обычный Unicode.

Так что, на мой взгляд, лучше всего использовать обычный текст ASCII-символов с некоторым набором кодирования. Необходимо использовать Unicode, если вы используете более 2 наборов разных символов (языки) в одиночку.

Это довольно редкий случай. В большинстве случаев достаточно 2 набора символов. Для этого распространенного случая используйте символы ASCII, а не Unicode.

Эффект от использования мультибутовых символов, таких как UTF-8, позволяет получить только традиционный китайский, арабский или какой-либо иероглифический текст. Это очень, очень редкий случай !!!

Я не думаю, что в этом нуждается много людей. Так что никогда не используйте UTF-8 !!! Это позволяет избежать сильной головной боли при манипулировании такими строками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...