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


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

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

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

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

  • Автор темы
  • Участник
  • *
  • Сообщений: 165
    • Просмотр профиля
Доброго времени суток. Изучаю C. Хочу написать код, который создаёт текстовый файл, с некоторым содержимым в формате Utf-8. Моя попытка выглядит так:
Код: C
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. int main(int argc, char *argv[]) {
  5.        
  6.         wchar_t *s1 = L"Привет, мир!\n";
  7.         wchar_t *s2 = L"Hello, World!";
  8.        
  9.         FILE *fp = fopen("./hello.txt", "w");
  10.        
  11.         fputws(s1, fp);
  12.         fputws(s2, fp);
  13.        
  14.         fclose(fp);
  15.        
  16.         exit(EXIT_SUCCESS);
  17. }
  18.  
Однако открыв в gedit результат, вижу это:
??????, ???!
Hello, World!
Почему вместо кирилицы кракозяблы?

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

Оффлайн Jack Sparrow

  • Активист
  • *
  • Сообщений: 629
    • Просмотр профиля
Меня подобный вопрос тоже интересует, поэтому подпишусь.
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

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

Оффлайн Yurror

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

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

Код: C
  1. #include <stdlib.h>
  2. #include <locale.h>
  3. #include <stdio.h>
  4. #include <wchar.h>
  5.  
  6. int main(int argc, char** argv)
  7. {
  8.     /* Ставим текущую локаль заданную переменными окружения LANG и LC_* */
  9.     setlocale(LC_ALL, "");
  10.    
  11.     const wchar_t *wstr1 = L"Привет, мир!";
  12.     const wchar_t *wstr2 = L"Hello, world!";
  13.    
  14.     FILE *fp = fopen("test.txt", "w+");
  15.  
  16.     fwprintf(fp, L"%S\n", wstr1);
  17.     fwprintf(fp, L"%S\n", wstr2);
  18.    
  19.     fclose(fp);
  20.    
  21.     return (EXIT_SUCCESS);
  22. }
  23.  

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

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

Оффлайн Yurror

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

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

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

Оффлайн Jack Sparrow

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

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

  • Активист
  • *
  • Сообщений: 629
    • Просмотр профиля
Ни первая, ни вторая версии не выводят русские буквы, а английские выводят.
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
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<wchar.h>
  4. #include <locale.h>
  5.  
  6. int main(int argc, char *argv[]) {     
  7.  
  8.     const char* current = setlocale(LC_CTYPE, "");  
  9.        
  10.     wchar_t *s1 = L"Привет, мир!\n";
  11.     wchar_t *s2 = L"Hello, World!";
  12.    
  13.     FILE *fp = fopen("./hello.txt", "w");
  14.    
  15.     fputws(s1, fp);
  16.     fputws(s2, fp);
  17.    
  18.     fclose(fp);
  19.        
  20.         setlocale(LC_CTYPE, current);
  21.    
  22.     exit(EXIT_SUCCESS);
  23. }
  24.  
Я там на всякий случай добавил восстановление локализации обратно - "срисовал" с другого форума.

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

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

Оффлайн Jack Sparrow

  • Активист
  • *
  • Сообщений: 629
    • Просмотр профиля
В Убунте проверил - работает. В Маке тоже работает, но если компилировать из командной строки, неважно, или это 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.129 секунд. Запросов: 25.