|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
02.07.2008, 15:43 | #1 |
Пользователь
Регистрация: 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; } Как исправить? |
02.07.2008, 20:35 | #2 |
...
Форумчанин
Регистрация: 01.06.2008
Сообщений: 134
|
Вам сначала нужно установить нужную локаль, копайте в сторону стандартной сишной функции setlocale().
P.S. попробовал ваш пример, _putwch не спасло – были те же вопросительные знаки. |
03.07.2008, 00:58 | #3 |
Пользователь
Регистрация: 05.10.2007
Сообщений: 34
|
Странно, что у вас не работает _putwch(), а у меня работает....
У меня проблема с wprintf Может вы не поставили в опциях saving options кодировку unicode? Или может пользуетесь другой версией C++ Еще, возможно, у вас стоит шрифт в консоли какой-нибудь растровый (тогда понятно почему вопросики), или какой-нибудь векторный, и даже юникодный, но не поддерживающий катакану(например Lusida Console, хотя в этом случае дожны отображаться квадратики ) в этом случае можно просто в программе при тестировании заменить японские буковки на какие-нибудь более распространненые юникодные (всякие типа таких ǜǞǠȂȁȚȟȏȎȊɝɆɄɂʆɶɷɸʬʢʡϠϡ) они есть почти во всех юникодных шрифтах Моя программа во вложении Я использую VC++ 8 express Не думаю, что спасет setLocale. |
03.07.2008, 02:25 | #4 | |
...
Форумчанин
Регистрация: 01.06.2008
Сообщений: 134
|
Цитата:
Использую студию 2008, соответственно это VC++ 9.0. Но причина не в этом точно. Вся проблема в том, что в виндовой консоли используется OEM кодировка, поэтому требуется преобразования как ANSI, так и UNICODE символы. Чтобы это преобразование было правильным, нужно приложить дополнительные усилия. setlocale() произведет настройку локали консоли, в результате чего будет правильное автоматическое преобразование к OEM кодировки, один символ которой к слову занимает только один байт. Дабы воодушевить приведу пример, правда на нашем родном языке. Рассмотрим два варианта программы: 1) Код:
Код:
Код:
Код:
|
|
03.07.2008, 12:44 | #5 |
Пользователь
Регистрация: 05.10.2007
Сообщений: 34
|
Это легко проверить. Во вложении моего предыдущего сообщения есть кроме исходников .exe файл. Он у меня выводит три японские буковки с помощью _putwch() . Если у вас не выведет ни буковки ни квадратики, а вопросительные знаки, то проблема действительно может быть в настройках винды. Кстати, какой у вас все-таки шрифт в консоли стоит? Шрифт, который использую я, на всякий случай прилагаю
|
03.07.2008, 13:02 | #6 |
Пользователь
Регистрация: 05.10.2007
Сообщений: 34
|
Про setlocale я давно знаю, но такое решение с указанием языка меня не устранивает... Хотелось бы выводить unicode строку консоль в независимости от содержания строки (на это и unicode)
Про OEM кодировку вы случайно не путаете с WIN95-98 ? В NT насколько я знаю все построено на unicode. А OEM в моем случае, насколько я понимаю, это то же что 866.Если я сменю кодовую страницу функцией setlocale это мало что поменяет. В любом случае, OEM поддерживает только 256 символов, а значит по китайски уже написать ничего не сможет (у них букв гораздо больше) |
03.07.2008, 21:13 | #7 | ||
...
Форумчанин
Регистрация: 01.06.2008
Сообщений: 134
|
Цитата:
Цитата:
|
||
04.07.2008, 00:25 | #8 |
Пользователь
Регистрация: 05.10.2007
Сообщений: 34
|
Вот программа на этот раз создана и откомпилирована как релиз в VC++ 2008 Express
Выводит много юникодных символов в консоль Если будет шрифт Lucida Console почти все правда будет квадратиками. Растровый шрифт выведет вопросики. Еще заметил если при запуске стоял растровый шрифт в консоли, то изменение его на векторный уже от вопросиков не избавит, поэтому шрифт в консоли придется менять заранее |
05.07.2008, 23:40 | #9 | ||
...
Форумчанин
Регистрация: 01.06.2008
Сообщений: 134
|
При шрифте, который у меня назван "Точечные шрифты":
Цитата:
Кстати, при копировании из консоли при "Lucida Console" в поле ввода сообщения в браузере увидел: Цитата:
|
||
06.07.2008, 13:41 | #10 |
Пользователь
Регистрация: 05.10.2007
Сообщений: 34
|
Да, к сожалению, стандартый шрифт Lucida Console поддерживат маленькую часть уникода.... Поэтому-то я и использую для консольных приложений в основном Everson Mono...
Но это другая проблема - проблема отображения, а меня больше волнует проблема вывода... |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |