Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как преобразовать DOS в Unicode  [new]
ryasal
Member

Откуда: Россия
Сообщений: 152
inData CLOB; -- это входной файл в DOS-кодировке
n_Data NCLOB;

inData := convert(inData, 'UTF8', 'RU8PC866');
n_Data := TO_NCLOB(inData);

После преобразования длина входных данных увеличивается в два раза (к каждому символу добавляется пробел)
Однако, дело в том, что в дальнейший код для разбора строк файла написан для CP1251. Можно ли преобразовать входную DOS -строку в Unicode так, чтобы можно было работать со старым кодом разбора строк файла?
P.S. TO_NCLOB возможно не нужен, не нашел разницы между ним и CLOB в хранении строк.
20 июл 06, 12:17    [2904080]     Ответить | Цитировать Сообщить модератору
 Re: Как преобразовать DOS в Unicode  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
Можно все-таки поподробнее?
1) файл - это что? Внешняя таблица или BFILE?
2) "дальнейший код для разбора" - это что? PL-процедура? Внешнее приложение?
3) database characterset, database national characterset какой?
20 июл 06, 12:32    [2904179]     Ответить | Цитировать Сообщить модератору
 Re: Как преобразовать DOS в Unicode  [new]
ryasal
Member

Откуда: Россия
Сообщений: 152
1)
файл-это txt-файл, я его с помощью дельфи пихаю в in_data функцию обработки файла(это и есть часть кода функции), функция возвращает CLOB, содержащий XML

2)
  FUNCTION fnc(in_data IN CLOB)
  RETURN CLOB
  IS
   pos                             number:=1;
   t_date_start                 NVARCHAR2(32):='Начало прокачки:';   
   n_Data                        NCLOB;
   res_str                        varchar2(2000);  


  BEGIN    

    inData := in_data;
    inData := convert(inData, 'UTF8', 'RU8PC866');    
      

  WHILE pos < length(inData)
  LOOP
    str:=substr(inData, pos, instr(inData, NCHR(10), pos) - pos - 1); -- отдельная 
                                                                                           --строка файла

    IF instr(str,t_date_start)<>0 THEN
      res_str := substr(str,instr(str,NCHR(32),-1,2)+1,length(str)-instr(str,NCHR(32),-1,2));
    END IF;

    /*
     тут еще куда подобных IF
    */

      pos := instr(inData, NCHR(10), pos) + 1;
   END LOOP;

END;

3)
database characterset - UTF8
database national characterset - UTF16
20 июл 06, 12:45    [2904254]     Ответить | Цитировать Сообщить модератору
 Re: Как преобразовать DOS в Unicode  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
1) В функции не нужен CONVERT. Преобразование будет выполняться автоматически, если Вы правильно установите переменную окружения NLS_LANG
2) Вам не нужен NCHAR, запутаетесь окончательно
3) Не следует использовать для поиска варианты типа NCHR(CODE), CHR(CODE). Вместо этого используйте непосредственно символы, получить которые в database-кодировке не так сложно.
20 июл 06, 12:51    [2904315]     Ответить | Цитировать Сообщить модератору
 Re: Как преобразовать DOS в Unicode  [new]
ryasal
Member

Откуда: Россия
Сообщений: 152
еще одно уточнение
в дельфи нет NCLOB, поэтому входной файл только в виде CLOB
а как видите, установки базы, Unicod-овские
20 июл 06, 12:54    [2904351]     Ответить | Цитировать Сообщить модератору
 Re: Как преобразовать DOS в Unicode  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
ryasal
еще одно уточнение
в дельфи нет NCLOB, поэтому входной файл только в виде CLOB
а как видите, установки базы, Unicod-овские

И?
Я же говорю - не надо Вам NCLOB, NVARCHAR2 и прочих N :)
20 июл 06, 12:56    [2904363]     Ответить | Цитировать Сообщить модератору
 Re: Как преобразовать DOS в Unicode  [new]
ryasal
Member

Откуда: Россия
Сообщений: 152
спасибо, сейчас буду основательно разбираться :)
20 июл 06, 12:57    [2904382]     Ответить | Цитировать Сообщить модератору
 Re: Как преобразовать DOS в Unicode  [new]
Levandovskiy
Member

Откуда:
Сообщений: 329
Вопрос немного не по теме - при работе с CLOB не корректно работает convert.
NLS_CHARACTERSET=CL8MSWIN1251
Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production
Это так и должно быть?
declare
  c clob := 'Тест';
  v varchar2(32767) := 'Тест';
begin
  dbms_output.put_line(convert(c, 'UTF8'));
  dbms_output.put_line(convert(v, 'UTF8'));
end;
------
"5AB
Тест
20 июл 06, 14:26    [2905029]     Ответить | Цитировать Сообщить модератору
 Re: Как преобразовать DOS в Unicode  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
Levandovskiy
Вопрос немного не по теме - при работе с CLOB не корректно работает convert.

Не знаю.
Вообще convert(varchar2) и convert(clob) - это две разные функции.
Поэкспериментировал, пришел к выводу, что convert(clob) в 9i вообще не различает на юникодные чарсеты.
У меня гонит в AL16UTF16 независимо от параметра.
NLS_NCHAR_CHARACTERSET=AL16UTF16
NLS_CHARACTERSET=RU8PC866:
SQL> create table ane_test_clob(v varchar2(100), c clob);

Table created

SQL> insert into ane_test_clob values('Тест','Тест');

1 row inserted

SQL> select v,c
,convert(v,'AL32UTF8') vu
,convert(v,'AL16UTF16') vuAL16
,to_char(convert(c,'AL32UTF8')) cu1
,to_char(convert(c,'AL16UTF16')) cu2
,to_char(convert(c,'AL24UTFFSS')) cu3
,convert(to_char(c),'UTF8') cvu
from ane_test_clob;

V     C     VU         VUAL16     CU1        CU2        CU3        CVU
----- ----- ---------- ---------- ---------- ---------- ---------- ----------
Тест  Тест  ?в???Б?В   .".5.A.B   .".5.A.B   .".5.A.B   .".5.A.B   ?в???Б?В

SQL> 
20 июл 06, 15:35    [2905500]     Ответить | Цитировать Сообщить модератору
 Re: Как преобразовать DOS в Unicode  [new]
Levandovskiy
Member

Откуда:
Сообщений: 329
Да, у меня для CLOB также конвертит в NLS_NCHAR_CHARACTERSET.
Получается convert для clob просто аналог TRANSLATE
20 июл 06, 16:03    [2905711]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как преобразовать DOS в Unicode  [new]
Rekfuby
Member

Откуда:
Сообщений: 10
Тут недавно столкнулся с подобной проблемой требовалось перекодировать из CL8MSWIN1251 в UTF8.
Помогла решить пробелу следующая конструкция:
l_clob := convert (to_multi_byte (l_clob),'UTF8');
Надеюсь, что кому-нибудь пригодится.
3 окт 08, 20:52    [6264317]     Ответить | Цитировать Сообщить модератору
 Re: Как преобразовать DOS в Unicode  [new]
Levandovskiy
Member

Откуда:
Сообщений: 329
Rekfuby
Тут недавно столкнулся с подобной проблемой требовалось перекодировать из CL8MSWIN1251 в UTF8.
Помогла решить пробелу следующая конструкция:
l_clob := convert (to_multi_byte (l_clob),'UTF8');
Надеюсь, что кому-нибудь пригодится.

TO_MULTI_BYTE
Oracle® Database SQL Reference
10g Release 1 (10.1)
This function does not support CLOB data directly. However, CLOBs can be passed in as arguments through implicit data conversion.
4 окт 08, 09:11    [6264949]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как преобразовать DOS в Unicode  [new]
bodrox
Member

Откуда:
Сообщений: 106
SoutLine := convert(sOutLine, 'RUPC866');
конвертит, а
sOutLine := convert(sOutLine, 'CL8MSWIN1251', 'RUPC866');
русские буквы в «???????» превращает — потому что текущая кодовая страница не 'CL8MSWIN1251'?

Спасибо за коды «CL8MSWIN1251, RUPC866»! А то голову ломал, как же :).
6 сен 11, 10:08    [11232370]     Ответить | Цитировать Сообщить модератору
 Re: Как преобразовать DOS в Unicode  [new]
MazoHist
Guest
автор
Спасибо за коды «CL8MSWIN1251, RUPC866»! А то голову ломал, как же :)

select * from V$NLS_VALID_VALUES
where parameter='CHARACTERSET'
Сам забываю откуда брать, теперь, надеюсь, запомню.
6 сен 11, 11:30    [11232958]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить