Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не транслитится буква я -> ja, в то время как ю->ju работает

1.8K
12 января 2004 года
Andreww
81 / / 02.01.2004
Ну прямо мистика какая-то. (Продолжаю написание проги ля СМС, с авторизацией пока не разобрался, но зато сделал интересное открытие). Кусок кода, который отвечает за транслитерацию (при нажатии на кнопку "Транслитеровать", сообщение русскими буквами сохраняется в *.txt файл, потом оттуда считывается ф-ей getc(Translit) таким образом:

int i=0;
while ((MessageRU = getc(Translit)) != EOF)
{
i+=1;
};
). Таким образом запихиваем текстовуху в массив. 1 буква - 1 элемент.

Далее транслитеруем:

int k=0;
for(int j = 0; j < i; j++)
{

if(MessageRU[j] == 'а')
{
MessageEN[k] = 'a';
k+=1;
if (k > 160)
MessageBox(Application -> Handle, "Длина сообщения превышает 160 символов. Это не допустимо", "Ошибка", MB_OK +
MB_ICONWARNING );
}

if(MessageRU[j] == 'б')
{
MessageEN[k] = 'b';
k+=1;
if (k > 160)
MessageBox(Application -> Handle, "Длина сообщения превышает 160 символов. Это не допустимо", "Ошибка", MB_OK +
MB_ICONWARNING );
}

Прикол в том, что это работает:

if(MessageRU[j] == 'ю')
{
MessageEN[k] = 'j';
k+=1;
MessageEN[k] = 'u';
k+=1;
if (k > 160)
MessageBox(Application -> Handle, "Длина сообщения превышает 160 символов. Это не допустимо", "Ошибка", MB_OK +
MB_ICONWARNING );
}

А ЭТО НЕ РАБОТАЕТ (буква "я" никак не транслитеруется и вообще не воспринимается как будто ее нету вообще! Как пустое место!):

if(MessageRU[j] == 'я')
{
MessageEN[k] = 'j';
k+=1;
MessageEN[k] = 'a';
k+=1;
if (k > 160)
MessageBox(Application -> Handle, "Длина сообщения превышает 160 символов. Это не допустимо", "Ошибка", MB_OK +
MB_ICONWARNING );
}

Еще прикольнее что для большой буквы "Я" все работает.

Попытки заменить "я" на коды '\255', '\377', '\xff' ничего не дали, в то время как подобная замена для "ю" вполне работает.

Почему такая дискриминация для буквы "я"? Может кто-нибудь обьяснить эту аномалию.
PS Транслитеруются ЛЮБЫЕ комбинации (ж-zh, щ-sch), кроме буквы я!
293
13 января 2004 года
SEDEGOFF
586 / / 06.10.2002
А если попробывать вот такую строку
______я______
Что получаеться
1.8K
13 января 2004 года
Andreww
81 / / 02.01.2004
Цитата:
Originally posted by SEDEGOFF
А если попробывать вот такую строку
______я______
Что получаеться



Получается такое: ______
То есть все после буквы "я" и она тоже удаляются

415
13 января 2004 года
SLA
274 / / 08.08.2003
Цитата:
Originally posted by Andreww
Попытки заменить "я" на коды '\255', '\377', '\xff' ничего не дали, в то время как подобная замена для "ю" вполне работает.



1. Коды символов бывают от 0 до 255. '\377' не существует.
2. Символы 'я' и 'Я' - совершенно разные вещи, друг к другу отношения вообще не имеющие.
3. Насколько я помню, ASCII-код символа 'я' = 255, т.е. он самый крайний в таблице символов. Может в этом и дело?
4. Прогони этот кусок кода в дебаггере, тогда узнаешь, в каком месте программа "глотает" символ 'я'.

1.6K
14 января 2004 года
Unexpected
137 / / 09.12.2002
Цитата:
Originally posted by SLA
1. Коды символов бывают от 0 до 255. '\377' не существует.

Существует:)
\377 - восмеричная кодировка (255 в десятичной)
А в остальном согласен. Без отладчика фиг поймешь...:(

487
15 января 2004 года
ddnh_bc
301 / / 16.09.2003
Цитата:
Originally posted by Unexpected
Существует:)
\377 - восмеричная кодировка (255 в десятичной)
А в остальном согласен. Без отладчика фиг поймешь...:(



Хм.
Точно незнаю природы сего глюка - однако зачастую подобные вещи случаются из-за сравнения знаковых/беззнаковых значений.
Может стоит попробовать написать так:
if((BYTE)MessageRU[j] == 'я')?

Вообще-то могу посоветовать следующее - перекодировку символов - правильнее и проще реализовывать при помощи таблиц перекодировки - существенно уменьшится объем кода, да и скорость выполнения.

1.6K
15 января 2004 года
Unexpected
137 / / 09.12.2002
Цитата:
Originally posted by ddnh_bc
Хм.
Точно незнаю природы сего глюка - однако зачастую подобные вещи случаются из-за сравнения знаковых/беззнаковых значений.
Может стоит попробовать написать так:
if((BYTE)MessageRU[j] == 'я')?

Не катит. ВСЯ русская часть имеет код >127 т.е. заведомо переполнение для знакового байта.

487
16 января 2004 года
ddnh_bc
301 / / 16.09.2003
Цитата:
Originally posted by Unexpected
Не катит. ВСЯ русская часть имеет код >127 т.е. заведомо переполнение для знакового байта.



Не совсем понял.
Если ты при сравнении делаешь преобразование char к BYTE - то сравнение будет беззнаковым - причем тут переполнение знакового бита?
А вот в ситуации когда идет сравнение char с буквой 'я' - как раз и может возникнуть ситуация что програ вместо того чтобы просто сравнить коды 0xFF и 0xFF будет сравнивать -127 и 255 - поэтому естественно они будут неравны. (Хотя и не уверен, что проблема тут именно в этом).

1.8K
16 января 2004 года
Andreww
81 / / 02.01.2004
Цитата:
Originally posted by ddnh_bc


Не совсем понял.
Если ты при сравнении делаешь преобразование char к BYTE - то сравнение будет беззнаковым - причем тут переполнение знакового бита?
А вот в ситуации когда идет сравнение char с буквой 'я' - как раз и может возникнуть ситуация что програ вместо того чтобы просто сравнить коды 0xFF и 0xFF будет сравнивать -127 и 255 - поэтому естественно они будут неравны. (Хотя и не уверен, что проблема тут именно в этом).



Когда я заюзал вот такую предложенную конструкцию
if((BYTE)MessageRU[j] == 'я'),

то получил сообщение:
[C++ Warning] SMS.cpp(526): W8068 Constant out of range in comparison

Обьясните пожалуйста что это такое. То есть переводить не надо :-), тут понятно; А как с этим бороться?

И обьясните плз вот это (цитирую кусок ответа ddnh_bc):
перекодировку символов - правильнее и проще реализовывать при помощи таблиц перекодировки - существенно уменьшится объем кода, да и скорость выполнения.

Если я правильно понимаю таблица перекодировки это то что находится на последних страницах моей книжки "Подбельский Фомин, Программирование....." И там типа есть кодовая таблица DOS (866), WINDOWS (1251). Ну и там написаны шестнадцатеричные, десятичные, восьмеричные коды букв, и всяких символов. То как тогда уменьшится обьем кода? Скорее всего я что-то не так понял. Можно поподробнее? Может этот процесс можно автоматизировать, может есть готовые ф-и ? А то я уже задолбался - ВСЕ буквы работают кроме я! :-((

487
17 января 2004 года
ddnh_bc
301 / / 16.09.2003
Цитата:
Originally posted by Andreww

Если я правильно понимаю таблица перекодировки это то что находится на последних страницах моей книжки "Подбельский Фомин, Программирование....." И там типа есть кодовая таблица DOS (866), WINDOWS (1251). Ну и там написаны шестнадцатеричные, десятичные, восьмеричные коды букв, и всяких символов. То как тогда уменьшится обьем кода? Скорее всего я что-то не так понял. Можно поподробнее? Может этот процесс можно автоматизировать, может есть готовые ф-и ? А то я уже задолбался - ВСЕ буквы работают кроме я! :-((



По поводу варнинга могу сказать следующее - компилятору ненравится несоответсвие типов. Тобишь 'я'он все-таки считает как char а не как byte.

По поводу таблиц перекодировки.
В этом нет ничего сложного. Любая таблица перекодировки - это не более чем массив (как правило размером в 256 элементов) где каждый элемент таблицы соответсвует новому значению перекодируемого символа исходной строки. Вот и все.

В качестве примера приведу тебе свой исходник перекодировки текста из обычной windows 1251 в разные кодировки.

Хидер:

//---------------------------------------------------------------------------
#ifndef convertH
#define convertH
//---------------------------------------------------------------------------
#include <classes.hpp>
//---------------------------------------------------------------------------
const char _cp866[0x100]=
{
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,
0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,
0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,
0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,
0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,
0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,
0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,
0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,
0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF
};
const char _iso_8859_5[0x100]=
{
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,
0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,
0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,
0x90,0x91,0x92,0x93,0x94,0xF7,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,
0xA0,0xA6,0xF6,0xA3,0xA4,0xA5,0x93,0xFD,0xA1,0xA9,0xA3,0xAB,0x95,0xAD,0xAE,0xA4,
0xA7,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xF1,0xF0,0xF3,0xBB,0xBC,0xBD,0xBE,0xF4,
0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,
0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,
0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,
0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF
};
const char _koi8_r[0x100]=
{
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,
0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,
0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,
0x9A,0x9F,0x97,0xA3,0x9D,0xA5,0xBB,0xA7,0xB3,0xA9,0x99,0xAB,0xA8,0xAD,0xAE,0x93,
0x9C,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0x9E,0xA3,0xBF,0x98,0xBB,0xBC,0xBD,0xBE,0x9B,
0xE1,0xE2,0xF7,0xE7,0xE4,0xE5,0xF6,0xFA,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,
0xF2,0xF3,0xF4,0xF5,0xE6,0xE8,0xE3,0xFE,0xFB,0xFD,0xFF,0xF9,0xF8,0xFC,0xE0,0xF1,
0xC1,0xC2,0xD7,0xC7,0xC4,0xC5,0xD6,0xDA,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,
0xD2,0xD3,0xD4,0xD5,0xC6,0xC8,0xC3,0xDE,0xDB,0xDD,0xDF,0xD9,0xD8,0xDC,0xC0,0xD1
};
const char _koi8_u[0x100]=
{
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,
0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,
0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,
0x90,0x91,0x92,0x93,0x94,0xA7,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,
0x9A,0xB6,0xA6,0xA3,0x9D,0xA5,0xBB,0xA7,0xB3,0xA9,0xBD,0xAB,0xA8,0xAD,0xAE,0xB4,
0xB7,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0x9E,0xA3,0xBF,0xAD,0xBB,0xBC,0xBD,0xBE,0xA4,
0xE1,0xE2,0xF7,0xE7,0xE4,0xE5,0xF6,0xFA,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,
0xF2,0xF3,0xF4,0xF5,0xE6,0xE8,0xE3,0xFE,0xFB,0xFD,0xFF,0xF9,0xF8,0xFC,0xE0,0xF1,
0xC1,0xC2,0xD7,0xC7,0xC4,0xC5,0xD6,0xDA,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,
0xD2,0xD3,0xD4,0xD5,0xC6,0xC8,0xC3,0xDE,0xDB,0xDD,0xDF,0xD9,0xD8,0xDC,0xC0,0xD1
};
const char _x_mac_cyrillic[0x100]=
{
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,
0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,
0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,
0x90,0x91,0x92,0x93,0x94,0xA5,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,
0xA0,0xD8,0xD9,0xA3,0xFF,0xA5,0xA6,0xA4,0xDD,0xA9,0xB8,0xAB,0xAC,0xAD,0xAE,0xBA,
0xA1,0xB1,0xB2,0xB3,0xB4,0xB5,0xA6,0xB7,0xDE,0xDC,0xB9,0xBB,0xBC,0xBD,0xBE,0xBB,
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,
0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,
0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xDF
};
//---------------------------------------------------------------------------
extern AnsiString __fastcall _convert_to_codepage(AnsiString src,AnsiString codepage);
//---------------------------------------------------------------------------
#endif

ЦПП-шник:

//---------------------------------------------------------------------------
#pragma hdrstop

#include "convert.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
AnsiString __fastcall _convert_to_codepage(AnsiString src,AnsiString codepage)
{
char *xlat;
if (codepage=="windows-1251") return src;
if (codepage=="cp866") xlat=(char*)_cp866;
if (codepage=="iso-8859-5") xlat=(char*)_iso_8859_5;
if (codepage=="koi8-r") xlat=(char*)_koi8_r;
if (codepage=="koi8-u") xlat=(char*)_koi8_u;
if (codepage=="x-mac-cyrillic") xlat=(char*)_x_mac_cyrillic;
for (int i=0;i<src.Length();i++) src.c_str()=xlat[(BYTE)src.c_str()];
return src;
}
//---------------------------------------------------------------------------

Вот собственно и все.
На вход в функцию даешь исходную строку и название кодировки - на выходе получаешь строку уже перекодированную.

Так что как сам видишь - увеличивается размер только инициализируемых данных - и то ненамного по 256 байт на каждую кодировку. А код на перекодировку - кот наплакал.

Если не разберешься как на кодовой таблице тебе твою проблему решить - пиши мне на мыло: [email]begemot_cat@mail.ru[/email] - я тебе приблизительный исходник функции для тебя составлю - а там переработаешь его по своему вкусу.

1.8K
17 января 2004 года
Andreww
81 / / 02.01.2004
Большое спасибо, обязательно попробую ().
1.8K
24 января 2004 года
Andreww
81 / / 02.01.2004
Цитата:
Originally posted by ddnh_bc

По поводу таблиц перекодировки.
В этом нет ничего сложного. Любая таблица перекодировки - это не более чем массив (как правило размером в 256 элементов) где каждый элемент таблицы соответсвует новому значению перекодируемого символа исходной строки. Вот и все.

В качестве примера приведу тебе свой исходник перекодировки текста из обычной windows 1251 в разные кодировки.......



Вчера сдал сесию, решил заняться своими прогами :-) Вашу конструкцию попробовал, она вполне работает, но как я понял это не то что мне нужно. Если я правильно понимаю, с помощью такой таблицы (как выше) и куска кода можно перекодировать кириллицу туды <--> сюды в разные кодировки. А мне надо кириллицу (1251) переводить в латинницу, чтоб отправлять СМС-ки английскими буквами. То-есть (если ход моей мысли неправильный, пожалуйста поправьте) нужно взять еще подобную таблицу для латинских букв и дальше аналогично, с учетом ж <-> zh, и т д. НО приведенная таблица есть не что иное как массив шестнадцатеричных кодов кирилических букв. То есть опять возвращаемся к моей конструкции: "Если найден символ '\xFF' (то есть я), то заменить на '\x6A' и '\x61' (то есть на ja)". Вроде так?

423
26 января 2004 года
Quasi
98 / / 20.01.2000
Кусок кода хотя и паскалевый/дельфовый, но зато работет))
Я думаю тебе это и надо

unit Translit;

interface

function RusToEng(source:string):string;
function EngToRus(source:string):string;

implementation

const
transl: array [1..66,1..2] of string=
(('ё','yo'),('Ё','YO'),
('ж','zsh'),('Ж','ZSH'),
('ч','ch'),('Ч','CH'),
('ш','sh'),('Ш','SH'),
('щ','sch'),('Щ','SCH'),
('ц','ts'),('Ц','TS'),
('ю','yu'),('Ю','YU'),
('я','ya'),('Я','YA'),
('а','a'),('А','A'),
('б','b'),('Б','B'),
('в','v'),('В','V'),
('г','g'),('Г','G'),
('д','d'),('Д','D'),
('е','e'),('Е','E'),
('з','z'),('З','Z'),
('и','i'),('И','I'),
('й','y'),('Й','Y'),
('к','k'),('К','K'),
('л','l'),('Л','L'),
('м','m'),('М','M'),
('н','n'),('Н','N'),
('о','o'),('О','O'),
('п','p'),('П','P'),
('р','r'),('Р','R'),
('с','s'),('С','S'),
('т','t'),('Т','T'),
('у','u'),('У','U'),
('ф','f'),('Ф','F'),
('х','h'),('Х','H'),
('ь',''''),('Ь',''''),
('ъ',''''),('Ъ',''''),
('ы','y'),('Ы','Y'),
('э','e'),('Э','E'));

function RusToEng(source:string):string;
var
i,j:word;
tmp:string;
begin
tmp:=source;
for i:=1 to 66 do
while pos(transl[i,1],tmp)<>0 do
begin
j:=pos(transl[i,1],tmp);
Delete(tmp,j,1);
insert(transl[i,2],tmp,j);
end;
result:=tmp;
end;

function EngToRus(source:string):string;
var
i,j:word;
tmp:string;
begin
tmp:=source;
for i:=1 to 66 do
while pos(transl[i,2],tmp)<>0 do
begin
j:=pos(transl[i,2],tmp);
Delete(tmp,j,length(transl[i,2]));
insert(transl[i,1],tmp,j);
end;
result:=tmp;
end;

end.
1.8K
26 января 2004 года
Andreww
81 / / 02.01.2004
Цитата:
Originally posted by Quasi
Кусок кода хотя и паскалевый/дельфовый, но зато работет))


Главное не язык, главное идея! Спасибо, попробую заюзать :-)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог