LINUX.ORG.RU

[C++] пытаюсь reversнуть строку с русскими буквами (utf8), а оно...

 


0

0

Есть вот такой, например, код:

#include <iostream>
using namespace std;

void ret_str(char* s)
{
if(*s != '\0')
ret_str(s+1);

cout<<*(s);
}

int main()
{
ret_str("привет");
cout << endl;
return 0;
}

И выводит он вот такое(не знаю, отобразится ли верно, но суть будет ясна):
&#65535;&#1141;ви&#1024;&#1151;

Вот "в" и "и" нормально перевернулись, а остальное..

Как жить?


Эта галимотья и не должна нчиего осмысленного делать. Покури man utf8. В этой кодировке на разные символы представляются разным количеством байт, так что тупо переписав _байты_ строки в обратном порядке, ничего хорошего не получишь. Посмотри, например, на исходники glib, там есть функции для работы с utf8.

ЗЫ: и незачем здесь делать рекурсию.

devinull ★★
()

В boost тоже вроде были классы для работы с utf8?

Selecter ★★★★
()
Ответ на: комментарий от romanSA

Правда? И где в стандарте это сказано? И как std::wstring работает с UTF-8? Портабельно? Нафига тогда товарищи из преокта gtkmm написали свой класс для UTF-8 строк?

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

> И как std::wstring работает с UTF-8?

Никак. :) Ты не врубился, сначала надо с помощью iconv(3) перекодировать из char* или string в wstring. Потом делать что хочешь. Потом перекодировать обратно.

ero-sennin ★★
()
Ответ на: комментарий от romanSA

std::wstring это std::basic_string<wchar_t>.

wchar_t сам по себе непортабелен, потому что в разных средах имеет разный размер. Думается мне, что это не последний аргумент из-за которого в Qt, например, на него забили.

devinull ★★
()
Ответ на: комментарий от devinull

Так и float "непортабельный", так что его теперь не использовать?
Да если вдуматься то и long "непортабелен", так как на разных машинах
может быть разный порядок следования байт в слове.
Пора уж привыкнуть, что данные на диске хранятся в определенной
кодировке/формате, а не в binary.

romanSA
()
Ответ на: комментарий от Begemoth

1. iconv(3) не нужен - читайте стандарт C++ (std::locale, std::codecvt и иже с ними)

2. в С++ используются не кодировки, а локали. Локаль по-умолчанию: C (она же POSIX)

romanSA
()
Ответ на: комментарий от Begemoth

> 1. где про iconv(3) сказано в стандарте?

В мане написано: conforming to POSIX.1-2001. Хотя сам я стандарт не изучал. ;)

> 2. а какая кодировка используется в std::wstring по стандарту?

WCHAR_T :)

А вообще-то, проще не париться, а заюзать какой-нибудь GLib или даже QtCore. =)

ero-sennin ★★
()
Ответ на: комментарий от ero-sennin

Ну конечно, можно не париться :) Можно и QT использовать в консольном приложении (да ещё туда X-сы линковать, впрочем может для QtCore X-сы и не нужны - здесь я не в курсе).

Только что делать, если нужно переносимое приложение (сервер) написать так чтобы работало на разных UNIX-ах и собиралось не только GCC?

Я ведь просто предлагаю использовать стандартные вещи для C++ Неужели это большая проблема?

romanSA
()
Ответ на: комментарий от romanSA

Увы, друг, стандартные вещи для C++ (codecvt и wstring) сделаны несколько через задницу. После того, как я пытался свою старую программу на чистом C++ научить юникоду, я стал понимать ВСЛ, когда он говорил, что создателю С++ место в дурке или на погосте. :D Нет, пользоваться этим можно, конечно, если иметь свинцовые штаны и мешок димедролу. Но таки я не махозист, и мучаться-осиливать не стал, а просто взял и переписал всё под QtCore4. И нечего тут бояться, QtCore не зависит от иксов, и вообще ни от чего не зависит. Очень приятная библиотека на все случаи жизни, примерно, как GLib для C. С тех пор я делаю QString::fromUtf8("блаблабла") и горя не знаю. :) У меня libQtCore.so занимает около 2-х мегабайт, не так уж много. Если надо полегче, есть libglib-2.0.so (500 килобайт). Эти библиотеки собираются и работают везде. Так стоит ли трахаться? :)

ero-sennin ★★
()
Ответ на: комментарий от ero-sennin

Странно, а я вот ничего "страшного" в codecvt и не заметил. Пришлось конечно пару дней почитать стандарт и полазить по сети.

Правда, судя по всему, стандарт плюсов писали "математики", которым за некоторые имена функций нужно *** оторвать (одна showmanyc() чего стоит: "переводится" как "es-how-many-see").

А так все в принципе понятно. Другое дело, если вдруг захочешь свои иостримы понаделать, то придется попотеть.

romanSA
()
Ответ на: комментарий от romanSA

Type wchar_t is a distinct type whose values can represent distinct codes for all members of the largest extended character set specified among the supported locales (22.1.1). Type wchar_t shall have the same size, signedness, and alignment requirements (3.9) as one of the other integral types, called its underlying type.

wchar_t впринципе может быть и в 1 байт размером. еще вопросы? ;~)

devinull ★★
()

кончай трахаться с долбаными юниксами
в которых до сих пор нет нормального юникода

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.