Размер строки UTF-8 в байтах - PullRequest
1 голос
/ 28 января 2011

Я использую QString для хранения строк, и теперь мне нужно сохранить эти строки (преобразованные в кодировку UTF-8) в структурах POD, которые выглядят так:

template < int N >
struct StringWrapper
{
  char theString[N];
};

Чтобы преобразовать необработанные данные из QString, я делаю это так:

QString str1( "abc" );
StringWrapper< 20 > str2;
strcpy( str2.theString, str1.toUtf8().constData() );

Теперь вопрос. Я заметил, что если я конвертирую из обычной строки, она работает нормально:

QString str( "abc" );
std::cout<< std::string( str.toUtf8().constData() ) << std::endl;

выдаст в качестве вывода:

abc

но если я использую некоторые специальные символы, например, например:

QString str( "Schöne Grüße" );
std::cout<< std::string( str.toUtf8().constData() ) << std::endl;

Я получаю такой мусор:

Gr\xC3\x83\xC2\xBC\xC3\x83\xC2\x9F

Я явно что-то упускаю, но что именно не так?


ДОПОЛНИТЕЛЬНЫЙ ВОПРОС

Каков максимальный размер символа в кодировке UTF-8? Я прочитал это здесь это 4 байта.

Ответы [ 2 ]

3 голосов
/ 28 января 2011

Первый вопрос, на который вам нужно ответить, - это какая кодировка ваших исходных файлов?Конструктор по умолчанию QString предполагает, что это Latin1, если вы не измените его с помощью QTextStream :: setCodecForCStrings ().Поэтому, если ваши источники находятся не в латинице 1 (скажем, в UTF-8), вы получите неверный результат на этом этапе:

QString str( "Schöne Grüße" );

Теперь, если ваши источники находятся в UTF-8, вам нужнозамените его на:

QString str = QString::fromUtf8( "Schöne Grüße" );

Или, что еще лучше, используйте QObject :: trUf8 () везде, где это возможно, поскольку это дает вам возможности i18n в качестве бесплатного бонуса.

Следующее, что нужно проверить, этоКакая кодировка вашей консоли?Вы пытаетесь напечатать на него строку UTF-8, но поддерживает ли она UTF-8?Если это консоль Windows, то, вероятно, нет.Если это что-то совместимое с xterm с использованием шрифта Unicode в системе * nix с некоторым языковым стандартом * .UTF-8, все должно быть в порядке.

К вашему отредактированному вопросу:

Я не вижу причин не доверять Википедии, особенно когда она относится к определенному стандарту.Также упоминается, что UTF-8 имел до 6 байтов.По моему опыту, 3 байта - это максимум, что вы получаете с разумными символами на родном языке, такими как латиница / кириллица / иврит / китайский / японский.4 байта, вероятно, используются для чего-то более экзотического, вы всегда можете проверить стандарты, если вам действительно интересно.

1 голос
/ 28 января 2011

Первое, что пойдет не так, это ваше высказанное предположение. QString не хранит UTF-8, он хранит строки Unicode. Вот почему вам нужно позвонить str1.toUtf8(). Создает временную строку UTF-8.

Вторая часть - это как работает UTF-8. Это многобайтовое расширение ASCII. üß не являются символами ASCII, и вы ожидаете, что оба символа получат многобайтовое представление. std::cout очевидно не ожидает UTF-8. Это зависит от используемого std::locale.

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