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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.06.2011, 09:44   #11
fomikadze
Пользователь
 
Регистрация: 13.06.2011
Сообщений: 17
Вопрос

Венцом всех размышлений стало вот это
wchar_t *translit(wchar_t *val)
{
wchar_t low[] = {L"абвгдеёжзийклмнопрстуфхцчшщьыъэю я"};
wchar_t high[] = {L"АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮ Я"};
wchar_t *engArr[2][33] = {
{L"a",L"b",L"v",L"g",L"d",L"e",L"yo ",L"zh",L"z",L"i",L"y",
L"k",L"l",L"m",L"n",L"o",L"p",L"r", L"s",L"t",L"u",L"f",
L"kh",L"ts",L"ch",L"sh",L"shch",L"' '",L"y",L"'",L"e",L"yu",L"ya"},

{L"A",L"B",L"V",L"G",L"D",L"E",L"Yo ",L"Zh",L"Z",L"I",L"Y",
L"K",L"L",L"M",L"N",L"O",L"P",L"R", L"S",L"T",L"U",L"F",
L"Kh",L"Ts",L"Ch",L"Sh",L"Shch",L"' '",L"Y",L"'",L"E",L"Yu",L"Ya"}
};

int len = wcslen(&val);
bool trig = false;

wchar_t *result = new wchar_t[len*2];
result = NULL;

for(int i = 0; i < len; i++)
{
for(int j = 0; j <= 33; j++)
{
if(val[i] == low[j])
{
wcscat(result, engArr[0][j]);
trig = true;
break;
} else if(val[i] == high[j])
{
wcscat(result, engArr[1][j]);
trig = true;
break;
}
}
if (!trig)
{
wcscat(result, val[i]);
} else {trig = false;}
}

return result;
}
Но есть пара проблем, когда происходит перевод, в начало записывается муть какая то, а потом уже транслит. И при переводи символов типа (\?\!\"\'....) вылетает ошибка. А ещё мне нужно умудриться транслитировать казахскую раскладку, на данный момент которую он воспринимает весьма болезненно
Что делать?
fomikadze вне форума Ответить с цитированием
Старый 24.06.2011, 09:47   #12
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а UTF8 уже не юникод?
мультибайтовые(символ состоит из нескольких char'ов(для UTF8)/wchar_t(для UTF16(правда на практике не встречал мультибайтовости тут), причем количество байт на символ может быть переменное) кодировки не отменяли.

правда может ошибаюсь про основную кодировку никсов...
(хотя терминал при загрузке готовится именно к UTF8)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 24.06.2011 в 09:50.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.06.2011, 09:49   #13
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Цитата:
Что делать?
Используйте STL, упростите себе задачу в несколько раз... И ждите, сейчас напишу готовый код.
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 24.06.2011, 09:50   #14
fomikadze
Пользователь
 
Регистрация: 13.06.2011
Сообщений: 17
По умолчанию

Как это делать?
Я с юникодом не работал, а вот теперь столкнулся.
Что и как тут я не знаю...
Гуглил несколько часов, результат тоже, ничего не нарыл полезного, разъясняющего.
fomikadze вне форума Ответить с цитированием
Старый 24.06.2011, 09:52   #15
fomikadze
Пользователь
 
Регистрация: 13.06.2011
Сообщений: 17
Радость

Цитата:
Сообщение от Сtrl Посмотреть сообщение
Используйте STL
Слышал. Даже начинал читать, что то сложись...
Ща полезу смотреть
Спасибо
fomikadze вне форума Ответить с цитированием
Старый 24.06.2011, 10:09   #16
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Пепел Феникса, +1

Оп-па.. дожились...
по вашему, если Unicode нет - то кириллица не поддерживается?
Т.е. в DOSских программах/Win9x кириллицы вообще не было, так?!
и Delphi до версии 2009 тоже строки с кириллицей принимала, так по вашему?!

ответ. Это не так!
обычный однобайтовый Char может хранить значения от 0 до 255. Туда помещается как латиница, так и кириллица.. (ну, разумеется, в определённой кодовой таблице - что определяется условиями использования программы).
Serge_Bliznykov, не передёргивайте. Я написал "как пример". Это совсем не значит что ничего другого там не используется.

Цитата:
Юникод и традиционные кодировки

Внедрение Юникода привело к изменению подхода к традиционным 8-битным кодировкам. Если раньше кодировка задавалась шрифтом, то теперь она задаётся таблицей соответствия между данной кодировкой и Юникодом. Фактически 8-битные кодировки превратились в форму представления некоторого подмножества Юникода. Это намного упростило создание программ, которые должны работать с множеством разных кодировок: теперь, чтобы добавить поддержку ещё одной кодировки, надо всего лишь добавить ещё одну таблицу перекодировки в Юникод.

Кроме того, многие форматы данных позволяют вставлять любые символы Юникода, даже если документ записан в старой 8-битной кодировке. Например, в HTML можно использовать коды с амперсандом.
А на счёт кодировок в DOS, я Вам скажу следующее.
Свой первый компьютер я собрал собственными руками в 1982-м году на процессоре КР580ВМ80А. Кодировка в знакогенераторе там была ASCII.
В ней были латинские заглавные буквы и карилица, то-же заглавные. Всё это умещалось в один байт (256 знаков). В нынешнее время этот рудиментарный отросток остался в виде типа char.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 24.06.2011, 10:12   #17
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
А на счёт кодировок в DOS, я Вам скажу следующее.
Свой первый компьютер я собрал собственными руками в 1982-м году на процессоре КР580ВМ80А. Кодировка в знакогенераторе там была ASCII.
а я про DOS разве говорил?
это и без вас знаю, и хвастаться про сборку своими руками не к месту не стоило.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.06.2011, 10:23   #18
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Smitt&Wesson
Serge_Bliznykov, не передёргивайте. Я написал "как пример". Это совсем не значит что ничего другого там не используется.
это я передёргиваю?!?!!

это Ваши слова?
Цитата:
Сообщение от Smitt&Wesson
Зачем Вы используете тип char? Во-первых это однобайтный тип. Во-вторых, ним можно закодировать только латиницу.
Так вот. Это НЕ ТАК! Типом char можно закодировать НЕ ТОЛЬКО латиницу.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.06.2011, 10:43   #19
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Сделал без поддержки Unicode, т.к. тогда придется покидать уютную консольку, а так вот:
Код:
#include <iostream>
#include <string>
#include <map>

namespace translit {
	typedef std::map<char, std::string> dict_t;
	dict_t std_dict;

	void init_std_dict(void);
	std::string translate(const std::string src, dict_t& dict = std_dict);
}

void translit::init_std_dict(void)
{
	std_dict[' '] = " ";
	std_dict['а'] = "a";
	std_dict['б'] = "b";
	std_dict['в'] = "v";
	std_dict['г'] = "g";
	std_dict['д'] = "d";
	std_dict['е'] = "e";
	std_dict['ё'] = "yo";
	std_dict['ж'] = "zh";
	//дальше сами...
}

std::string translit::translate(const std::string src, translit::dict_t& dict)
{
	std::string result;
	for (std::string::const_iterator iter = src.begin(); iter != src.end(); ++iter)
	{
		char sym = *iter;
		result += dict[sym];
	}
	return result;
}

int main()
{
	translit::init_std_dict();//инициализация словаря
	
	std::string buffer = "а б в г д е ё ж";

	std::cout << "Translated: " << std::endl;
	std::cout << translit::translate(buffer) << std::endl;

	std::cin.get();
	return 0;
}
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 24.06.2011, 10:46   #20
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
и хвастаться про сборку своими руками не к месту не стоило.
Ну тут да, малость перегнул палку. Зацепило просто.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Ответ


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