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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.09.2013, 13:23   #1
tiger()
Пользователь
 
Регистрация: 09.04.2011
Сообщений: 49
По умолчанию Напечатать русский текст в UTF-8

Русские буквы в уникоде начинаются с 0x410, то есть два байта.

Английские буквы печатаются нормально (0x40, 0x41, ...)
"Левые" буквы типа "Ð" (0xD0) тоже печатаются.

А вот русская "А" с кодом 0x410 - нет, даже не открывается файл со шрифтом. Шрифт FBF, какой именно сказать не могу, какой-то пропраэтарный.
Пробовал выводить букву "А" в виде 0x10 (семь последних значащих битов в 32-битном или 16-битном UTF), но так они просто игнорируются.

Подскажите пожалуйста какие еще можно эксперименты сделать.

Последний раз редактировалось tiger(); 04.09.2013 в 13:44.
tiger() вне форума Ответить с цитированием
Старый 04.09.2013, 18:44   #2
chipside
Форумчанин
 
Регистрация: 03.08.2013
Сообщений: 208
По умолчанию

Не знаю какие именно эксперементы вы делаете, но если у Вас массив типа char (однобитовый),
то выводить нужно попарно (в два байта). Одной кириллической букве соответствуют два байта.
К примеру,
char szA[3] = "А";
cout << szA << endl;
Последний байт для строкового терминатора.
Строковой терминатор ('\0' служит для указания на конец массива).
В юникоде есть специальные переключатели - символы, указывающие на применение национальных языков.
Стоит поискать два парных символя для вывода русского "А".

Последний раз редактировалось chipside; 04.09.2013 в 18:52.
chipside вне форума Ответить с цитированием
Старый 09.09.2013, 10:09   #3
tiger()
Пользователь
 
Регистрация: 09.04.2011
Сообщений: 49
По умолчанию

Цитата:
Сообщение от chipside Посмотреть сообщение
Не знаю какие именно эксперементы вы делаете, но если у Вас массив типа char (однобитовый),
то выводить нужно попарно (в два байта). Одной кириллической букве соответствуют два байта.
К примеру,
char szA[3] = "А";
cout << szA << endl;
Последний байт для строкового терминатора.
Строковой терминатор ('\0' служит для указания на конец массива).
В юникоде есть специальные переключатели - символы, указывающие на применение национальных языков.
Стоит поискать два парных символя для вывода русского "А".
Я разобрался, в итоге проблема была вот в чем:
- оригинальный шрифт вообще не имел русского языка, поставил русскоязычный шрифт, тоже с уникодом
- действительно, считывать надо по 2 байта, т.к. русские буквы в уникоде кодируются по 2 байта. но тогда не работают однобайтовая первая часть таблицы уникода, где расположены латинские буквы. для моего применения это не важно, но все равно как-то криво.
- переводы двухбайтовых символов в однобайтовые кодировки с переносом значащих битов не помогают
tiger() вне форума Ответить с цитированием
Старый 09.09.2013, 12:15   #4
Vladiger
Пользователь
 
Регистрация: 31.08.2013
Сообщений: 93
По умолчанию

Не совсем понял в чем проблема?
MultiByteToWideChar() из ANSI в Unicode
WideCharToMultiByte() из Unicode в ANSI

Код:
#include <windows.h>
#include <iostream>

using namespace std;

int main() {
	setlocale(LC_ALL, "Rus");

	char strAnsi[100];
	wchar_t strUnicode[100];

	strcpy_s(strAnsi, 100, "Однобайтовый текст ANSI");
	MultiByteToWideChar(CP_ACP, 0, strAnsi, 100, strUnicode, 100);
	wcscat_s(strUnicode, 100, L" конвертированный в Unicode");

	cout << strAnsi << endl;
	wcout << strUnicode << endl;
	system("PAUSE");
	return 0;
}
Vladiger вне форума Ответить с цитированием
Старый 09.09.2013, 19:24   #5
asmprog
Пользователь
 
Регистрация: 10.08.2013
Сообщений: 67
По умолчанию

если уж потоки ввода/вывода, то ios::imbue
asmprog вне форума Ответить с цитированием
Старый 10.09.2013, 08:18   #6
tiger()
Пользователь
 
Регистрация: 09.04.2011
Сообщений: 49
По умолчанию

Цитата:
Сообщение от Vladiger Посмотреть сообщение
Не совсем понял в чем проблема?
MultiByteToWideChar() из ANSI в Unicode
WideCharToMultiByte() из Unicode в ANSI
Если бы было нужно печатать вмешанный текст, в котором мы бы не знали где стоят русские, а где латинские буквы, это было бы невозможно определить: для драйвера вывода текста есть только формат чтения (1 или 2 байта) и набор байтов откуда брать и все.
tiger() вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Flash - Русский текст в xml Флеш madstill Общие вопросы Web 2 27.02.2013 23:07
русский текст и буквы majesticx777 Паскаль, Turbo Pascal, PascalABC.NET 0 15.06.2011 13:34
не вставляются русский текст Domanoff БД в Delphi 5 08.04.2010 11:53
TD не распознает русский текст Natalia-xxx- Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 05.03.2009 15:22
напечатать текст из Memo Sanek777 Общие вопросы Delphi 1 30.08.2008 21:25