Вопрос по перекодировке из DOS в Windows

Razrab
Дата: 12.11.2008 11:47:46
Здравствуйте!
Подскажите, каким образом можно перекодировать символы кириллицы из DOS (ASCII) в Windows (ANSI)?
Алфавит в кодировке DOS:
‰–“Љ…Ќѓ˜™‡•љ”›‚ЂЏђЋ‹„†ќџ—‘Њ€’њЃћр©жгЄҐ­Јий§екдлў Їа®«¤¦нпзб¬ЁвмЎос
cоответствует в Windows:
ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁйцукенгшщзхъфывапролджэячсмитьбюё

Если тупо сделать через Translate, то это не проходит, т.к. Oracle воспринимает некоторые вышеуказанные крикозявки как один символ '?'. Есть еще функция Convert, но какие точно параметры для кодировок в ней подставить, я нигде не нашел.
Помогите, заранее всех благодарю.
semenar
Дата: 12.11.2008 11:49:49
CONVERT(var, 'CL8MSWIN1251', 'RU8PC866');
Razrab
Дата: 12.11.2008 12:03:38
Не проходит, выдает:

???щ?ьК????З???тяЊы???Й???ъ???у?№???ф?эш??Є?????рч??????????с??ю?ё

Может досовская кодировка не RU8PC866?
orawish
Дата: 12.11.2008 12:39:29
SQL> create table t (s varchar2(200));

Таблица создана.

SQL> insert into t values
  2  ('0`&Ќ’Ь"!"a:¬Џђ}9 ќxRЖSЃ~р©жгЄҐ­Јий§екдлў Їа®«¤¦нпзб¬ЁвмЎос0`&Ќ’Ь"!"a:¬Џђ}9 ќxR
  3  ;

1 строка создана.

SQL> select s,CONVERT(s,'CL8MSWIN1251', 'RU8PC866') conv_s
  2  from t;

S
--------------------------------------------------------------------------------
CONV_S
--------------------------------------------------------------------------------
0`&Ќ’Ь"!"a:¬Џђ}9 ќxRЖSЃ~р©жгЄҐ­Јий§екдлў Їа®«¤¦нпзб¬ЁвмЎос0`&Ќ’Ь"!"a:
¬Џђ}9 ќxRЖSЃ~р©жгЄҐ­Јий§екдлў Їа®«¤¦нпзб¬ЁвмЎос
ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁйцукенгшщзхъфыв пролджэячсмитьбюёЙЦУКЕНГШЩЗХЪФЫ
ВАПРОЛДЖЭЯЧСМИТЬБЮЁйцукенгшщзхъфыв пролджэячсмитьбюё
andrey_anonymous
Дата: 12.11.2008 12:43:36
Razrab
Не проходит, выдает:

???щ?ьК????З???тяЊы???Й???ъ???у?№???ф?эш??Є?????рч??????????с??ю?ё

Может досовская кодировка не RU8PC866?

:)
1) Делаете select dump(YourField) from YourTable и наблюдаете реальные коды, лежащие в БД.
2) По результатам п.1 уточняете кодировку данных в БД и среаниваете ее с NLS_DATABASE_PARAMETERS.
3) Если не совпадает - convert данных
4) Если совпадает - дело на стороне клиента, смотрите NLS_LANG.
5) Когда окончательно запутаетесь - прочтите Globalization Support Guide, помогает.
Razrab
Дата: 12.11.2008 16:39:25
andrey_anonymous

select dump(YourField) from YourTable выдает для некоторых DOS символов один и тот же код - 63. Хотя на самом деле все символы разные - это алфавит. Даже такая команда:
select substr('‰–“Љ…Ќѓ˜™‡•љ”›‚ЂЏђЋ‹„†ќџ—‘Њ€’њЃћр©жгЄҐ­Јий§екдлў Їа®«¤¦нпзб¬ЁвмЎос',1,1) from dual;
выдает ? вместо ‰
Не могу сообразить как с этим бороться и как в итоге решить проблему перекодировки. Прямо замкнутый круг какой-то.
andrey_anonymous
Дата: 12.11.2008 16:49:06
Razrab
andrey_anonymous

select dump(YourField) from YourTable выдает для некоторых DOS символов один и тот же код - 63.

 
SQL> select chr(63) from dual;
 
CHR(63)
-------
?
 
SQL> 
Razrab
Хотя на самом деле все символы разные - это алфавит.

Не разные. Лежат у Вас в табличке покореженные данные (вернее, не прошедшие перекодировку из клиентского charset в database charset по причине отсутствия такого преобразования для конкретных кодов, не входящих в клиентский charset - такие символы заменяются знаком вопроса).

Вы бы задачку описали поподробнее - зачем Вам "DOS-алфавит" (что само по себе есть бред - существует русский алфавит и его представления в виде набора кодов, но нет в природе никакого "DOS-алфавита").
Есть мрачное подозрение, что Вы не совсем понимаете что и зачем делаете
Razrab
Дата: 12.11.2008 17:21:06
andrey_anonymous

Описываю суть задачи. Мне прислали текстовый файл в кодировке DOS (ASCII). Нужно этот файл перевести в кодировку Windows (ANSI), чтобы затем его нормально обработать и загрузить все данные из него (включая русские буквы) в Oracle. Но делать это нужно не вручную, а грузить такие файлы программно. Для этого уже есть прога на Oracle Forms 6, которая грузит аналогичные файлы именно в кодировке Windows (ANSI). Чтобы сильно не переписывать уже рабочую прогу имеет смысл выполнить такую перекодировку только с помощью функции на PL/SQL.
Razrab
Дата: 12.11.2008 17:23:15
Да, чуть не забыл, все русские символы в этом текстовом DOS-файле можно представить в виде:
‰–“Љ…Ќѓ˜™‡•љ”›‚ЂЏђЋ‹„†ќџ—‘Њ€’њЃћр©жгЄҐ­Јий§екдлў Їа®«¤¦нпзб¬ЁвмЎос
Это весь русский алфавит.
Elic
Дата: 12.11.2008 17:27:02
Razrab
Для этого уже есть прога на Oracle Forms 6, которая грузит аналогичные файлы именно в кодировке Windows (ANSI). Чтобы сильно не переписывать уже рабочую прогу имеет смысл выполнить такую перекодировку только с помощью функции на PL/SQL.
Уже не имеет. Поздно. Данные уже покорёжены, как и сказал andrey_anonymous.
Всё же почитай рекомендованный Globalization Support Guide.