LINUX.ORG.RU

Wchar_t не читает русские символы

 , , ,


0

1

Ситуация такая: Мне нужно вводить и выводить строки на русском, контролируя и обрезая длинну. Через обычный char не выходит. Он пишет в 2 раза меньше в строку. Что с этим сделать? ЗЫ. Wstring тоже не считывает и в отладчике видны только '\000'. Подскажите, мудрецы шо делать.

Маня, ты не можешь знать заранее сколько у тебя байтов в литерале будет, если это только не 8-битная кодировка. Wide это не решение, работай с обычными чарами, только с utf-8 (если у тебя только не Qt или подобное, тогда используй их абстракции).

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

в 8-битной кодировке 1 символ (литерал) == 1 байт, hence the name

utf-8 совместима с ANSI, значит 1 символ 1 байт для латиницы, например

ну и потом китайцы тоже люди, 6 байт на литерал вполне обычное дело (нет)

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

В utf-8 есть механизм точного определения длинны символа ничего перебирать не надо, в октете есть данные сколько байт нужно для символа. Проблем нет вообще никаких. И да ТСу вроде не надо китайского, да и китайский есть упрощённый который влазит в utf-8

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

Да. Но и эта страница и скорее вся или часть твоей системы с utf-8 работают и нет никаких проблем, согласен вручную если захочешь символ из середины строки поменять проблема тут либо уйти от юникода вообще взяв koi или подобное или или брать utf-32 где все символы есть и на поколения вперёд хватит. Куда не крути везде компромисс. Критикуешь, предлагай. Адекватных альтернатив utf-8 не вижу, utf-16 и жирнее и проблемы те же самые и жирно, utf-32 проблем нет, но ооочень жирно для текста. Брать чистые 7битные кодировки байт на символ смысла нет если нужна поддержка тучи языков.

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

Твои пара символов окажутся полутора символами даже с кириллицей (или ни одним), поэтому это не вариант. С текстом так больше не работают. Эта страница и большая часть твоей системы скорее всего завязаны на ICU, 1 кодпоинт = int32_t, utf16 с суррогатными кодпоинтами, вот это всё.

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

Эта страница и большая часть твоей системы скорее всего завязаны на ICU, 1 кодпоинт = int32_t, utf16 с суррогатными кодпоинтами, вот это всё.

Куда страна катится, одни алкаши кругом

annulen ★★★★★ ()