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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2012, 13:58   #1
The SCS
Пользователь
 
Регистрация: 15.01.2012
Сообщений: 98
По умолчанию Как использовать свою кодировку в программе?

Есть таблица символов http://worms2d.info/WA_character_table , это своя кодировка игрового чата. Кириллицу в других кодировках не понимает.

Следовательно, как мне ее использовать в программе? Чтобы я ввёл кириллицу и в чат пришла именно кириллица а не кракозябры?

Прошу разъяснить подробнее, т.к. с кодировками никогда не сталкивался.
The SCS вне форума Ответить с цитированием
Старый 23.01.2012, 14:47   #2
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Код:
const
  TranslationTableTo: array[AnsiChar] of AnsiChar = (#0, #1, ... #31, ' ', '!', '"', '#', '$', ...); // обратная таблица
  TranslationTableFrom: array[AnsiChar] of AnsiChar = (#0, #1, ... #31, ' ', '!', '"', '#', '$', ..., 'Б', 'Г', 'Д', ...); // короче, твоя таблица

  function TranslateTo(const ASource: AnsiString): AnsiString;
  var
    X: Integer;
  begin
    Result := ASource;
    for X := 1 to Length(Result) do
      Result[X] := TranslationTableTo[Result[X]];
  end;

  function TranslateFrom(const ASource: AnsiString): AnsiString;
  var
    X: Integer;
  begin
    Result := ASource;
    for X := 1 to Length(Result) do
      Result[X] := TranslationTableFrom[Result[X]];
  end;

var
  A: AnsiString;
begin
  A := 'Превед, медвед';

  A := TranslateTo(A);
  // A = дракозябры в твоей кодировке

  A := TranslateFrom(A);
  // A = 'Превед, медвед';
end;
Первая таблица делается так: берёшь 1251 и в каждую позицию вписываешь номер, который этот символ имеет в твоей таблице.

Например, с конца:
Код:
... { ю } #$B3, { я } #$B4);
Вторая таблица делается наоборот: берёшь твою и вписываешь номера для 1251:
Например, с конца:
Код:
... { þ } '?' { - нет такого символа}, { ÿ } #$A2);
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 23.01.2012, 15:16   #3
The SCS
Пользователь
 
Регистрация: 15.01.2012
Сообщений: 98
По умолчанию

Спасибо, попробую.
The SCS вне форума Ответить с цитированием
Старый 23.01.2012, 15:23   #4
The SCS
Пользователь
 
Регистрация: 15.01.2012
Сообщений: 98
По умолчанию

Что-то не понял как составить таблицу..
The SCS вне форума Ответить с цитированием
Старый 23.01.2012, 22:03   #5
The SCS
Пользователь
 
Регистрация: 15.01.2012
Сообщений: 98
По умолчанию

Так, составил своим методом.

Код:
const
  ruschars: Array[1..117] of Char = ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O',
                                'P','Q','R','S','T','U','V','W','X','Y','Z',
								                'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o',
                                'p','q','r','s','t','u','v','w','x','y','z',
                                'É','é',' ','À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç',
                                'Ê','È', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð',
                                'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', '×', 'Ø',
                                'Ù', 'Ü', 'Ú', 'Ý', 'Þ', 'ß','à', 'á',
                                'â', 'ã', 'ä', 'å', 'æ', 'ç','ê','è','ë',
                                'ì', 'í', 'î', 'ï', 'ð','ñ', 'ò','ó',
                                'ô', 'õ', 'ö', '÷', 'ø','ù', 'ü','ú',
                                 'ý', 'þ', 'ÿ','û','Û');
  wachars: Array[1..117] of Char = ({UPPER ENG -->}#$41,#$42,#$43,#$44,#$45,#$46,#$47,#$48,#$49,#$4A,#$4B,#$4C,#$4D,#$4E,#$4F,
                                #$50,#$51,#$52,#$53,#$54,#$55,#$56,#$57,#$58,#$59,#$5A,
                {LOWER ENG -->>}#$61,#$62,#$63,#$64,#$65,#$66,#$67,#$68,#$69,#$6A,#$6B,#$6C,#$6D,#$6E,#$6F,
                                #$70,#$71,#$72,#$73,#$74,#$75,#$76,#$77,#$78,#$79,#$7A,
                {UPPER RUS -->>}#$86,#$9E,#$20,#$41,#$80,#$42,#$81,#$82,#$45,#$83,#$84,#$87,#$85,#$88,#$4D,#$48,
                                #$4F,#$89,#$50,#$43,#$54,#$8A,#$8B,#$58,#$8C,#$8D,#$8E,#$8F,#$92,
                                #$90,#$93,#$94,#$96,{LOWER RUS -->>}#$61,#$97,#$98,#$99,#$9A,#$65,
                                #$9B,#$9C,#$A2,#$9D,#$A5,#$A6,#$A7,#$6F,#$A8,#$70,#$63,#$A9,#$79,
                                #$AA,#$78,#$AB,#$AC,#$AD,#$AE,#$B1,#$AF,#$B2,#$B3,#$B4,#$B0,#$91);

//**************

function Encode(input:string) :string;
var
lead: String;
i,j: Integer;
begin
lead:='';
for i:= 1 to 117 do for j:= 1 to 117 do begin
        if input[i] = ruschars[j] then begin
            lead := lead + wachars[j];

        end;
end;
result:=lead;
end;
До того как приписал латинницу, все было нормально.

Теперь кодирует и русс. и англ, но приписывает непойми что в конец переменной result: test TEST ©ec© TECTpp*PЄpda bo mi sie nie chce potem sluchac narzekaniaЄЄPopupMenufrmdk

туда попадают случайные символы, куски фраз из чата, ники юзеров. Что не так? Задолбался искать.
The SCS вне форума Ответить с цитированием
Старый 23.01.2012, 22:05   #6
The SCS
Пользователь
 
Регистрация: 15.01.2012
Сообщений: 98
По умолчанию

Правда из делфей кириллица криво копируется..
The SCS вне форума Ответить с цитированием
Старый 23.01.2012, 22:11   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

нужно переходить на русскую кодировку при копировании.

ну а по делу думаю проблема в том что не учтен терминальный символ(обычнo строки кончаються на #0) или длина строки(в зависимости от формата хранения)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.01.2012, 23:39   #8
The SCS
Пользователь
 
Регистрация: 15.01.2012
Сообщений: 98
По умолчанию

Так, ну это я решил обрезанием. Вычисляется длина исходной строки, остальное после перекодировки режется к чертям.
The SCS вне форума Ответить с цитированием
Старый 23.01.2012, 23:42   #9
The SCS
Пользователь
 
Регистрация: 15.01.2012
Сообщений: 98
По умолчанию

теперь другой прикол. Я написал функцию Encoding наоборот, чтобы декодировала:

Код:
function Decode(input:string ) :string;
var
lead: String;
i,j: Integer;
begin
lead:='';
for i:= 0 to 158 do for j:= 0 to 158 do begin
        if input[i] = wachars[j] then begin
            lead := lead + ruschars[j];

        end;
end;
result:={copy(lead,0,Length(input))}lead;
end;
Напомню, что игровая кодировка использует англ. А вместо русской, аналогично с "у", "х"...
Так вот при перекодировке эти буквы выводятся дважды: теесст, гeепaа кeеpрнeеcс. В чем проблема?
The SCS вне форума Ответить с цитированием
Старый 23.01.2012, 23:44   #10
The SCS
Пользователь
 
Регистрация: 15.01.2012
Сообщений: 98
По умолчанию

Коментарий остался от Encode.
The SCS вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как использовать в Delphi-программе функции из DLL, написанной на C# АТИКОН Общие вопросы Delphi 12 19.03.2013 08:28
Как изменить длину символов в программе HEX Editor ? jeffR Помощь студентам 8 04.11.2011 01:41
Как использовать глобальную таблицу в процедуре? Gandfil Общие вопросы Delphi 4 20.08.2011 13:02
Как вызвать стандартную таблицу символов Windows программно? SkAndrew Общие вопросы Delphi 11 13.04.2008 14:47