Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Кракозяблы вместо кирилицы в двухбайтовых символах  (Прочитано 1401 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Ленивый кот

  • Автор темы
  • Участник
  • *
  • Сообщений: 165
    • Просмотр профиля
Доброго времени суток. Изучаю C. Хочу написать код, который создаёт текстовый файл, с некоторым содержимым в формате Utf-8. Моя попытка выглядит так:
Код: (C) [Выделить]
#include<stdio.h>
#include<stdlib.h>

int main(int argc, char *argv[]) {

wchar_t *s1 = L"Привет, мир!\n";
wchar_t *s2 = L"Hello, World!";

FILE *fp = fopen("./hello.txt", "w");

fputws(s1, fp);
fputws(s2, fp);

fclose(fp);

exit(EXIT_SUCCESS);
}
Однако открыв в gedit результат, вижу это:
??????, ???!
Hello, World!
Почему вместо кирилицы кракозяблы?

Спасибо.
« Последнее редактирование: 22 Февраля 2013, 11:37:31 от Ленивый кот »

Оффлайн Jack Sparrow

  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
Меня подобный вопрос тоже интересует, поэтому подпишусь.
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн Кровавый

  • Старожил
  • *
  • Сообщений: 1626
  • Логика творит чудеса!
    • Просмотр профиля
А если не использовать GEdit?
cat ./hello.txt
Железо: AMD FX8350 4.2Ghz + 2x4Gb Kingston HeyperX + Asus M5A97 R2.0 + HDD WD WZ10EZEX 1TB 7200 rpm + SSD 128 GB + Win 10 x64.

Оффлайн Ленивый кот

  • Автор темы
  • Участник
  • *
  • Сообщений: 165
    • Просмотр профиля
А если не использовать GEdit?
cat ./hello.txt
Показывает те же знаки вопроса.

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1690
  • А чего вы так смотрите?..
    • Просмотр профиля
Ленивый кот, значит консоль не UTF-изирована.
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
С cat'ом - в сад. Написано же СИ!

Protopopulus,
увы, садись, два.

Код: (C) [Выделить]
#include <stdlib.h>
#include <locale.h>
#include <stdio.h>
#include <wchar.h>

int main(int argc, char** argv)
{
    /* Ставим текущую локаль заданную переменными окружения LANG и LC_* */
    setlocale(LC_ALL, "");
   
    const wchar_t *wstr1 = L"Привет, мир!";
    const wchar_t *wstr2 = L"Hello, world!";
   
    FILE *fp = fopen("test.txt", "w+");

    fwprintf(fp, L"%S\n", wstr1);
    fwprintf(fp, L"%S\n", wstr2);
   
    fclose(fp);
   
    return (EXIT_SUCCESS);
}

Оффлайн Ленивый кот

  • Автор темы
  • Участник
  • *
  • Сообщений: 165
    • Просмотр профиля
2 Yurror
Спасибо, заработало как надо! :) Подскажите, каким инструментом пользуетесь для подсветки синтаксиса?
« Последнее редактирование: 22 Февраля 2013, 08:18:55 от Ленивый кот »

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
[code=C][ /code]

Оффлайн Ленивый кот

  • Автор темы
  • Участник
  • *
  • Сообщений: 165
    • Просмотр профиля
[code=C][ /code]
Понял, спасибо. Отформатировал свой код выше в теме.

Оффлайн Jack Sparrow

  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
Странненько, но у меня этот код не работает. Русский текст вообще никак не выводится, ни вопросительных знаков - вообще ничего. Только латинские буквы выводятся.

Mac OS X, Xcode 4.5
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн Ленивый кот

  • Автор темы
  • Участник
  • *
  • Сообщений: 165
    • Просмотр профиля
Странненько, но у меня этот код не работает. Русский текст вообще никак не выводится, ни вопросительных знаков - вообще ничего. Только латинские буквы выводятся.

Mac OS X, Xcode 4.5
Ты о коде, версию которого дал Yurror?

Оффлайн Jack Sparrow

  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
Ни первая, ни вторая версии не выводят русские буквы, а английские выводят.
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн Ленивый кот

  • Автор темы
  • Участник
  • *
  • Сообщений: 165
    • Просмотр профиля
Ни первая, ни вторая версии не выводят русские буквы, а английские выводят.
Я попробую сейчас на Windows 7 x64 скомпилировать и запустить. Интересно, будет ли там работать...

Пользователь решил продолжить мысль 22 Февраля 2013, 15:06:46:
В Windows 7 x64 SP1 Enu у меня нормально скомпилировалась (с помощью MS Visual Studio 2012) и корректно отработала такая версия:

Код: (c) [Выделить]
#include<stdio.h>
#include<stdlib.h>
#include<wchar.h>
#include <locale.h>

int main(int argc, char *argv[]) {

    const char* current = setlocale(LC_CTYPE, ""); 

    wchar_t *s1 = L"Привет, мир!\n";
    wchar_t *s2 = L"Hello, World!";
   
    FILE *fp = fopen("./hello.txt", "w");
   
    fputws(s1, fp);
    fputws(s2, fp);
   
    fclose(fp);

setlocale(LC_CTYPE, current);
   
    exit(EXIT_SUCCESS);
}
Я там на всякий случай добавил восстановление локализации обратно - "срисовал" с другого форума.

Результат получен тот, который собственно и ожидался:
Привет, мир!
Hello, World!

Почему не работает на Mac OS X - не знаю и проверить не могу.
« Последнее редактирование: 22 Февраля 2013, 15:18:06 от Ленивый кот »

Оффлайн Jack Sparrow

  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
В Убунте проверил - работает. В Маке тоже работает, но если компилировать из командной строки, неважно, или это cc или gcc. А вот из Xcode не работает, однако!
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Jack Sparrow,
поищи на форуме Mac-разработчиков. Наверняка там локаль надо хитро загрузить или выставить соответствующее окружение. надо читать документацию как это сделать в Mac OS X

 

Страница сгенерирована за 0.046 секунд. Запросов: 25.