Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.07.2008, 15:43   #1
Legat
Пользователь
 
Регистрация: 05.10.2007
Сообщений: 34
Сообщение unicode и printf

Привет
Я пытаюсь печатать Unicode строку с помощью функции printf()
Но получается только фунцией _putwch() по одной букве...

(использую Microsoft VC++)

Вот код

#define UNICODE
#include <.....>
int main(){

wchar_t s2[]=L"ユンナ"; //unicode string
_putwch(s2[0]); // эти 3 строчки корректно выводят юникодные символы
_putwch(s2[1]); // в консоль
_putwch(s2[2]);
wprintf(L"\n -- %ls \n",s2); // А эта печает в консоль "-- ???"
_getwch();
return 0;
}

Как исправить?
Legat вне форума Ответить с цитированием
Старый 02.07.2008, 20:35   #2
filosof_x86
...
Форумчанин
 
Аватар для filosof_x86
 
Регистрация: 01.06.2008
Сообщений: 134
По умолчанию

Вам сначала нужно установить нужную локаль, копайте в сторону стандартной сишной функции setlocale().

P.S. попробовал ваш пример, _putwch не спасло – были те же вопросительные знаки.
filosof_x86 вне форума Ответить с цитированием
Старый 03.07.2008, 00:58   #3
Legat
Пользователь
 
Регистрация: 05.10.2007
Сообщений: 34
По умолчанию

Странно, что у вас не работает _putwch(), а у меня работает....

У меня проблема с wprintf


Может вы не поставили в опциях saving options кодировку unicode?
Или может пользуетесь другой версией C++

Еще, возможно, у вас стоит шрифт в консоли какой-нибудь растровый (тогда понятно почему вопросики), или какой-нибудь векторный, и даже юникодный, но не поддерживающий катакану(например Lusida Console, хотя в этом случае дожны отображаться квадратики ) в этом случае можно просто в программе при тестировании заменить японские буковки на какие-нибудь более распространненые юникодные (всякие типа таких ǜǞǠȂȁȚȟȏȎȊɝɆɄɂʆɶɷɸʬʢʡϠϡ) они есть почти во всех юникодных шрифтах

Моя программа во вложении
Я использую VC++ 8 express

Не думаю, что спасет setLocale.
Вложения
Тип файла: rar S.rar (480.8 Кб, 19 просмотров)
Legat вне форума Ответить с цитированием
Старый 03.07.2008, 02:25   #4
filosof_x86
...
Форумчанин
 
Аватар для filosof_x86
 
Регистрация: 01.06.2008
Сообщений: 134
По умолчанию

Цитата:
Сообщение от Legat Посмотреть сообщение
Странно, что у вас не работает _putwch(), а у меня работает....
Может вы не поставили в опциях saving options кодировку unicode?
Дело скорей на национальных настройках ОС + настройках самой консоли. Все необходимое для работы с Юникодом настроено.

Цитата:
Сообщение от Legat Посмотреть сообщение
Или может пользуетесь другой версией C++
Я использую VC++ 8 express
Использую студию 2008, соответственно это VC++ 9.0. Но причина не в этом точно.

Цитата:
Сообщение от Legat Посмотреть сообщение
Не думаю, что спасет setLocale
Вся проблема в том, что в виндовой консоли используется OEM кодировка, поэтому требуется преобразования как ANSI, так и UNICODE символы. Чтобы это преобразование было правильным, нужно приложить дополнительные усилия.

setlocale() произведет настройку локали консоли, в результате чего будет правильное автоматическое преобразование к OEM кодировки, один символ которой к слову занимает только один байт.

Дабы воодушевить приведу пример, правда на нашем родном языке. Рассмотрим два варианта программы:

1)
Код:
#include <iostream>

int main()
{
  wprintf(L"%s\n", L"Привет МИР!!");
  return 0;
}
Здесь у меня получился такой вывод:
Код:
?????? ???!!
2)
Код:
#include <iostream>
#include <clocale> // в случае Си, нужно использовать locale.h
int main()
{
  setlocale(LC_CTYPE, "RUS"); 
  // может в другой консоли RUS - не будет удовлетворять условю верного преобразования,
  // я в эти тонкости не вникал, обычно более англ. яз. не приходилось в консоли юзать
  wprintf(L"%s\n", L"Привет МИР!!");
  return 0;
}
Здесь у меня уже другой, нормальный вывод:
Код:
Привет МИР!!
filosof_x86 вне форума Ответить с цитированием
Старый 03.07.2008, 12:44   #5
Legat
Пользователь
 
Регистрация: 05.10.2007
Сообщений: 34
По умолчанию

Цитата:
Сообщение от filosof_x86 Посмотреть сообщение
Дело скорей на национальных настройках ОС + настройках самой консоли. Все необходимое для работы с Юникодом настроено.
Это легко проверить. Во вложении моего предыдущего сообщения есть кроме исходников .exe файл. Он у меня выводит три японские буковки с помощью _putwch() . Если у вас не выведет ни буковки ни квадратики, а вопросительные знаки, то проблема действительно может быть в настройках винды. Кстати, какой у вас все-таки шрифт в консоли стоит? Шрифт, который использую я, на всякий случай прилагаю
Вложения
Тип файла: rar evermono.rar (454.6 Кб, 18 просмотров)
Legat вне форума Ответить с цитированием
Старый 03.07.2008, 13:02   #6
Legat
Пользователь
 
Регистрация: 05.10.2007
Сообщений: 34
По умолчанию

Про setlocale я давно знаю, но такое решение с указанием языка меня не устранивает... Хотелось бы выводить unicode строку консоль в независимости от содержания строки (на это и unicode)

Про OEM кодировку вы случайно не путаете с WIN95-98 ? В NT насколько я знаю все построено на unicode. А OEM в моем случае, насколько я понимаю, это то же что 866.Если я сменю кодовую страницу функцией setlocale это мало что поменяет. В любом случае, OEM поддерживает только 256 символов, а значит по китайски уже написать ничего не сможет (у них букв гораздо больше)
Legat вне форума Ответить с цитированием
Старый 03.07.2008, 21:13   #7
filosof_x86
...
Форумчанин
 
Аватар для filosof_x86
 
Регистрация: 01.06.2008
Сообщений: 134
По умолчанию

Цитата:
Сообщение от Legat Посмотреть сообщение
Это легко проверить. Во вложении моего предыдущего сообщения есть кроме исходников .exe файл.
Сделайте статическую сборку, у меня версия VC++ поновее и dll соответствующих версий для запуска вашей программы в системе нет.

Цитата:
Сообщение от Legat Посмотреть сообщение
Про OEM кодировку вы случайно не путаете с WIN95-98 ? В NT насколько я знаю все построено на unicode.
Да, в NT появилась поддержка юникода, но консоль вроде по-прежнему использует OEM для вывода, для совместимости со старыми программами. Конечно, возможно что я и ошибаюсь, но вот, например, статья про кодировки ANSI и OEM в консоли Винды от 26.12.2007. Т.е. актуальность OEM кодировки есть и сейчас, на любой линейки.
filosof_x86 вне форума Ответить с цитированием
Старый 04.07.2008, 00:25   #8
Legat
Пользователь
 
Регистрация: 05.10.2007
Сообщений: 34
По умолчанию

Вот программа на этот раз создана и откомпилирована как релиз в VC++ 2008 Express
Выводит много юникодных символов в консоль
Если будет шрифт Lucida Console почти все правда будет квадратиками.
Растровый шрифт выведет вопросики.

Еще заметил если при запуске стоял растровый шрифт в консоли, то изменение его на векторный уже от вопросиков не избавит, поэтому шрифт в консоли придется менять заранее
Вложения
Тип файла: rar ConsoleApp_.rar (200.6 Кб, 28 просмотров)
Legat вне форума Ответить с цитированием
Старый 05.07.2008, 23:40   #9
filosof_x86
...
Форумчанин
 
Аватар для filosof_x86
 
Регистрация: 01.06.2008
Сообщений: 134
По умолчанию

При шрифте, который у меня назван "Точечные шрифты":
Цитата:
Testing _putwch()
This text "??? uA?????" is kind of unicode

Testing wprintf()
This text "??? ???????" is kind of Unicode
При шрифте "Lucida Console" во второй строке в кавычках были квадраты. Остальное также. В диалоговом окне были квадраты, т.е. как при "Lucida Console" во второй строке.

Кстати, при копировании из консоли при "Lucida Console" в поле ввода сообщения в браузере увидел:
Цитата:
Testing _putwch()
This text "ユンナ ǜǞǠȂȁȚȟ" is kind of unicode

Testing wprintf()
This text "??? ???????" is kind of unicode
filosof_x86 вне форума Ответить с цитированием
Старый 06.07.2008, 13:41   #10
Legat
Пользователь
 
Регистрация: 05.10.2007
Сообщений: 34
По умолчанию

Да, к сожалению, стандартый шрифт Lucida Console поддерживат маленькую часть уникода.... Поэтому-то я и использую для консольных приложений в основном Everson Mono...

Но это другая проблема - проблема отображения, а меня больше волнует проблема вывода...
Legat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Unicode в indy9 Mixasik Работа с сетью в Delphi 3 25.08.2008 15:44
поиск unicode символов kixaka Помощь студентам 1 15.06.2008 15:41
Разобратся в Unicode компоненты aizon Помощь студентам 9 24.03.2008 11:25
Unicode }{UTPUU Общие вопросы Delphi 4 02.04.2007 15:21
текстовый файл в unicode SVS Общие вопросы Delphi 2 13.02.2007 08:54