ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
12 июля
451510 Топик полностью
fk0, легенда (07.10.2013 13:11, просмотров: 256) ответил Ale3000 на Пишу на С++. Компилирую в gcc. Кодировка UTF-8 без BOM. Как некоторые нужные мне строки сделать в 1251-кодировке ?
Установить локаль в cp1251 и сделать sprintf или wcstombs() ? Волшебный макрос -- L"текст". Опять же в локали ru_RU.CP1251 (см. пример). А вообще по-уму дисплей нужно перевести в работу по ISO-8859-5 (он же в wchar_t). Для переменных. Для константных строк -- UTF-8 с динамической трансляцией в ISO. Так проще и не требует поддержки от компилятора. Это если для МК. #include <stdio.h> #include <stdlib.h> #include <wchar.h> #include <locale.h> int main() { const char *utf8="п═я┐я│я│п╨п╦п╧ я┌п╣п╨я│я┌."; wchar_t cp1251[]=L"п═я┐я│я│п╨п╦п╧ я┌п╣п╨я│я┌2."; setlocale(LC_ALL, ""); size_t n=mbstowcs(NULL, utf8, 0); wchar_t *w=malloc((n+1)*sizeof(wchar_t)); mbstowcs(w, utf8, n); printf("utf8->cp1251 = %ls\n", w); printf("L\"cp1251\" = %ls\n", cp1251); return 0; } Программу и компилятор можно позапускать с разными локалями (в unix -- LC_ALL=ru_RU.CP1251, например). Видно, что локаль компилятора ни на что не влияет. А локаль программы в момент исполнения по разному влияет на printf и на mbstowcs: на выводе и на вводе происходит конверсия из wchar в локаль (а не в utf-8) и наоборот. Поэтому первый printf всегда выдаёт в utf-8 (перевод туда-обратно в одной локали даст то, что было на входе). А второй выдаёт в нужной локали, т.е. env LC_ALL=ru_RU.CP1251 ./a.out | tail -1 | iconv -f cp1251 даст на выходе "Русский тескт2.", т.е. строка была в cp1251...
[ZX]