Задать вопрос
Genilot
@Genilot
Саморазвиваюсь

Как реализовать транслитерацию на C++?

Транслитерацию на дом. компьютере реализовал. Из файла читает русские символы, потом в другой записывает уже на транслите. Но когда программу открываю на другом компьютере все русские символы заменяются на какие-то краказябры, а исправить не получается, так как если пишу скажем "cout << (а == б);" выводит "1", то есть они равны.
В чем проблема не понимаю. (и на дом., и на других компьютерах Visual studio 2013)

Под спойлером полный код программы:
spoiler
//////////////////////////////////////////////////////
#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

string transliteration(string, int);

int main()
{
	ifstream file("file.txt");
	ofstream file2("file2.txt");
	string str;
	
	string result;

	while (file >> str)
	{
		result += (transliteration(str, str.size()) + " ");
	}

	file2 << result;

	file.close();
	file2.close();

	system("pause");
	return 0;
}


string transliteration(string str, int strSize)
{
	string sumStr = "";

	for (int i = 0; i < strSize; i++)
	{
		switch (str[i])
		{
		case 'а':
			sumStr += 'а';
			break;
		case 'А':
			sumStr += 'A';
			break;
		case 'б':
			sumStr += 'b';
			break;
		case 'Б':
			sumStr += 'B';
			break;
		case 'в':
			sumStr += 'v';
			break;
		case 'В':
			sumStr += 'V';
			break;
		case 'г':
			sumStr += 'g';
			break;
		case 'Г':
			sumStr += 'G';
			break;
		case 'д':
			sumStr += 'd';
			break;
		case 'Д':
			sumStr += 'D';
			break;
		case 'е':
			sumStr += 'e';
			break;
		case 'Е':
			sumStr += 'E';
			break;
		case 'ё':
			sumStr += "yo";
			break;
		case 'Ё':
			sumStr += "Yo";
			break;
		case 'ж':
			sumStr += "zh";
			break;
		case 'Ж':
			sumStr += "Zh";
			break;
		case 'з':
			sumStr += 'z';
			break;
		case 'З':
			sumStr += 'Z';
			break;
		case 'и':
			sumStr += 'i';
			break;
		case 'И':
			sumStr += 'I';
			break;
		case 'й':
			sumStr += 'y';
			break;
		case 'Й':
			sumStr += 'Y';
			break;
		case 'к':
			sumStr += 'k';
			break;
		case 'К':
			sumStr += 'K';
			break;
		case 'л':
			sumStr += 'l';
			break;
		case 'Л':
			sumStr += 'L';
			break;
		case 'м':
			sumStr += 'm';
			break;
		case 'М':
			sumStr += 'M';
			break;
		case 'н':
			sumStr += 'n';
			break;
		case 'Н':
			sumStr += 'N';
			break;
		case 'о':
			sumStr += 'o';
			break;
		case 'О':
			sumStr += 'O';
			break;
		case 'п':
			sumStr += 'p';
			break;
		case 'П':
			sumStr += 'P';
			break;
		case 'р':
			sumStr += 'r';
			break;
		case 'Р':
			sumStr += 'R';
			break;
		case 'с':
			sumStr += 's';
			break;
		case 'С':
			sumStr += 'S';
			break;
		case 'т':
			sumStr += 't';
			break;
		case 'Т':
			sumStr += 't';
			break;
		case 'у':
			sumStr += 'u';
			break;
		case 'У':
			sumStr += 'U';
			break;
		case 'ф':
			sumStr += 'f';
			break;
		case 'Ф':
			sumStr += 'F';
			break;
		case 'х':
			sumStr += 'x';
			break;
		case 'Х':
			sumStr += 'X';
			break;
		case 'ц':
			sumStr += 'c';
			break;
		case 'Ц':
			sumStr += 'C';
			break;
		case 'ч':
			sumStr += "ch";
			break;
		case 'Ч':
			sumStr += "Ch";
			break;
		case 'ш':
			sumStr += "sh";
			break;
		case 'Ш':
			sumStr += "Sh";
			break;
		case 'щ':
			sumStr += "shh";
			break;
		case 'Щ':
			sumStr += "Shh";
			break;
		case 'ъ':
			sumStr += '"';
			break;
		case 'ы':
			sumStr += 'y';
			break;
		case 'ь':
			sumStr += '\'';
			break;
		case 'э':
			sumStr += 'e';
			break;
		case 'Э':
			sumStr += 'E';
			break;
		case 'ю':
			sumStr += "yu"; 
			break;
		case 'Ю': 
			sumStr += "Yu";
			break;
		case 'я':
			sumStr += "ya";
			break;
		case 'Я':
			sumStr += "Ya";
			break;
		default:
			sumStr += str[i];
			break;
		}
	}

	return sumStr;
}
  • Вопрос задан
  • 868 просмотров
Подписаться 1 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 2
@d-stream
Готовые решения - не подаю, но...
chcp
chcp 1251
Ответ написан
Комментировать
@res2001
Developer, ex-admin
Обычно для перекодировки используют массив, код символа исходной строки является индексом массива.
Как-то так. В случае UTF8 сложнее, т.к. для русских символов используется 2 байта, но то же решается примерно тем же способом. Ну это отступление про алгоритм.
На счет кракозябр - не понятно что значит "открываю программу".

Открываете исходник в студии? Значит у вас студии настроены на разные кодировки исходников на разных компах. Рекомендую везде настроить на UTF8 и в настройках проекта включите поддержку UTF8.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы