LINUX.ORG.RU

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

 , , ,


0

1

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



Последнее исправление: Krot_wwe (всего исправлений: 2)

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

anonymous
()

Подскажите, мудрецы шо делать.

гуглить. в гугле столько решений этого вопроса, что не найти их просто невозможно.

Iron_Bug ★★★★★
()

Один символ в кирилице это 2 char. Обрабатывай символы парами. Совет плохой, но тебе я так понимаю хватит.

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

ээ, чё-то не очень идея. так и рождается говнокод, лучше уж с 8-битной кодировкой работать

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

Это и есть восьмибитная, но ширина символа не ограничена одним байтом, она же совместима с ANSI кодировкой, для кирилицы ровно 2 символа.

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

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

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

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

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

короче 8битный там только кодпоинт, это не символ

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

или наоборот, короче ты понял, в utf-8 нельзя сказать сколько байт займёт произвольный символ, пока не переберёшь все

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

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

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

длины 1 символа, угу. в 8-битной кодировке ты можешь быть уверен что в 10 байтах поместится 10 символов, в utf-8 это может быть и 2 и 10.

anonymous
()
Ответ на: комментарий от 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 ★★★★★
()

Решение

Решение банально и просто. Подключаем библиотеку locale и пишем locale::global (locale ("")); Это решает проблему на уровне wstring. Wchar хз.

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