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

Откуда: Москва
Сообщений: 678
Добрый день, есть функция, которая на вход получает параметр типа LONG. Есть ли другая функция (может, из DBMS_xxx пакетов или еще какая) определения кодировки этого входного текста. Тут я не говорю о кодировке настроек базы и пр. Нужно определить только кодировку текста, переданного в функцию. В частности, необходимо решить задачу - если кодировка не UFT8, то прерывать работу функции.

Спасибо.
20 июл 11, 16:22    [11001401]     Ответить | Цитировать Сообщить модератору
 Re: Как определить кодировку входного текста  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 7797
Текст русско-английский? Или может быть на любом языке?
21 июл 11, 19:56    [11009207]     Ответить | Цитировать Сообщить модератору
 Re: Как определить кодировку входного текста  [new]
MazoHist
Guest
begin
  dststr:=convert(srcstr,'CL8MSWIN1251','UTF8');
exception
  when others then
    if sqlcode = -12703 then
      --не utf-8
    end if;
end;
21 июл 11, 22:08    [11009581]     Ответить | Цитировать Сообщить модератору
 Re: Как определить кодировку входного текста  [new]
Flok
Member

Откуда:
Сообщений: 247
немного не в тему, но все же.
как-то раз у меня была необходимость перекодировать строку, которая в которую передавался текст, прочитанный в кодировке utf-8 (хотя он был в 1251). Тогда мне пришлось писать функцию по перекодировке русских букв (вместо них в этой строке, естественно, выходили кракозябры).
вот текст этой функции, вдруг кому понадобится.

CREATE OR REPLACE FUNCTION Decode_1251 (
    string_ IN VARCHAR2) RETURN VARCHAR2
IS
   next_char_    VARCHAR2 (5);
   next_         VARCHAR2 (5);
   out_string_   VARCHAR2 (2000);
   i_            NUMBER;

BEGIN
  IF string_ IS NOT NULL THEN
     IF asciistr(string_) = string_ THEN
        out_string_ := string_;
     ELSE
        FOR i_ IN 1 .. LENGTH (string_) LOOP
           next_char_ := SUBSTR (string_, i_, 1);
           CASE ASCIISTR (next_char_)
              WHEN '\0080' THEN next_ := unistr('\0402');
              WHEN '\0081' THEN next_ := unistr('\0403');
              WHEN '\0082' THEN next_ := unistr('\201A');
              WHEN '\0083' THEN next_ := unistr('\0453');
              WHEN '\0084' THEN next_ := unistr('\201E');
              WHEN '\0085' THEN next_ := unistr('\2026');
              WHEN '\0086' THEN next_ := unistr('\2020');
              WHEN '\0087' THEN next_ := unistr('\2021');
              WHEN '\0088' THEN next_ := unistr('\20AC');
              WHEN '\0089' THEN next_ := unistr('\2030');
              WHEN '\008A' THEN next_ := unistr('\0409');
              WHEN '\008B' THEN next_ := unistr('\2039');
              WHEN '\008C' THEN next_ := unistr('\040A');
              WHEN '\008D' THEN next_ := unistr('\049A');
              WHEN '\008E' THEN next_ := unistr('\04BA');
              WHEN '\008F' THEN next_ := unistr('\040F');
              WHEN '\0090' THEN next_ := unistr('\0452');
              WHEN '\0091' THEN next_ := unistr('\2018');
              WHEN '\0092' THEN next_ := unistr('\2019');
              WHEN '\0093' THEN next_ := unistr('\201C');
              WHEN '\0094' THEN next_ := unistr('\201D');
              WHEN '\0095' THEN next_ := unistr('\2022');
              WHEN '\0096' THEN next_ := unistr('\2013');
              WHEN '\0097' THEN next_ := unistr('\2014');
              WHEN '\0098' THEN next_ := unistr('\0098');
              WHEN '\0099' THEN next_ := unistr('\2122');
              WHEN '\009A' THEN next_ := unistr('\0459');
              WHEN '\009B' THEN next_ := unistr('\203A');
              WHEN '\009C' THEN next_ := unistr('\045A');
              WHEN '\009D' THEN next_ := unistr('\049B');
              WHEN '\009E' THEN next_ := unistr('\04BB');
              WHEN '\009F' THEN next_ := unistr('\045F');
              WHEN '\00A0' THEN next_ := unistr('\00A0');
              WHEN '\00A1' THEN next_ := unistr('\04B0');
              WHEN '\00A2' THEN next_ := unistr('\04B1');
              WHEN '\00A3' THEN next_ := unistr('\04D8');
              WHEN '\00A4' THEN next_ := unistr('\00A4');
              WHEN '\00A5' THEN next_ := unistr('\04E8');
              WHEN '\00A6' THEN next_ := unistr('\00A6');
              WHEN '\00A7' THEN next_ := unistr('\00A7');
              WHEN '\00A8' THEN next_ := unistr('\0401');
              WHEN '\00A9' THEN next_ := unistr('\00A9');
              WHEN '\00AA' THEN next_ := unistr('\0492');
              WHEN '\00AB' THEN next_ := unistr('\00AB');
              WHEN '\00AC' THEN next_ := unistr('\00AC');
              WHEN '\00AD' THEN next_ := unistr('\00AD');
              WHEN '\00AE' THEN next_ := unistr('\00AE');
              WHEN '\00AF' THEN next_ := unistr('\04AE');
              WHEN '\00B0' THEN next_ := unistr('\00B0');
              WHEN '\00B1' THEN next_ := unistr('\00B1');
              WHEN '\00B2' THEN next_ := unistr('\0406');
              WHEN '\00B3' THEN next_ := unistr('\0456');
              WHEN '\00B4' THEN next_ := unistr('\04E9');
              WHEN '\00B5' THEN next_ := unistr('\00B5');
              WHEN '\00B6' THEN next_ := unistr('\00B6');
              WHEN '\00B7' THEN next_ := unistr('\00B7');
              WHEN '\00B8' THEN next_ := unistr('\0451');
              WHEN '\00B9' THEN next_ := unistr('\2116');
              WHEN '\00BA' THEN next_ := unistr('\0493');
              WHEN '\00BB' THEN next_ := unistr('\00BB');
              WHEN '\00BC' THEN next_ := unistr('\04D9');
              WHEN '\00BD' THEN next_ := unistr('\04A2');
              WHEN '\00BE' THEN next_ := unistr('\04A3');
              WHEN '\00BF' THEN next_ := unistr('\04AF');
              WHEN '\00C0' THEN next_ := unistr('\0410');
              WHEN '\00C1' THEN next_ := unistr('\0411');
              WHEN '\00C2' THEN next_ := unistr('\0412');
              WHEN '\00C3' THEN next_ := unistr('\0413');
              WHEN '\00C4' THEN next_ := unistr('\0414');
              WHEN '\00C5' THEN next_ := unistr('\0415');
              WHEN '\00C6' THEN next_ := unistr('\0416');
              WHEN '\00C7' THEN next_ := unistr('\0417');
              WHEN '\00C8' THEN next_ := unistr('\0418');
              WHEN '\00C9' THEN next_ := unistr('\0419');
              WHEN '\00CA' THEN next_ := unistr('\041A');
              WHEN '\00CB' THEN next_ := unistr('\041B');
              WHEN '\00CC' THEN next_ := unistr('\041C');
              WHEN '\00CD' THEN next_ := unistr('\041D');
              WHEN '\00CE' THEN next_ := unistr('\041E');
              WHEN '\00CF' THEN next_ := unistr('\041F');
              WHEN '\00D0' THEN next_ := unistr('\0420');
              WHEN '\00D1' THEN next_ := unistr('\0421');
              WHEN '\00D2' THEN next_ := unistr('\0422');
              WHEN '\00D3' THEN next_ := unistr('\0423');
              WHEN '\00D4' THEN next_ := unistr('\0424');
              WHEN '\00D5' THEN next_ := unistr('\0425');
              WHEN '\00D6' THEN next_ := unistr('\0426');
              WHEN '\00D7' THEN next_ := unistr('\0427');
              WHEN '\00D8' THEN next_ := unistr('\0428');
              WHEN '\00D9' THEN next_ := unistr('\0429');
              WHEN '\00DA' THEN next_ := unistr('\042A');
              WHEN '\00DB' THEN next_ := unistr('\042B');
              WHEN '\00DC' THEN next_ := unistr('\042C');
              WHEN '\00DD' THEN next_ := unistr('\042D');
              WHEN '\00DE' THEN next_ := unistr('\042E');
              WHEN '\00DF' THEN next_ := unistr('\042F');
              WHEN '\00E0' THEN next_ := unistr('\0430');
              WHEN '\00E1' THEN next_ := unistr('\0431');
              WHEN '\00E2' THEN next_ := unistr('\0432');
              WHEN '\00E3' THEN next_ := unistr('\0433');
              WHEN '\00E4' THEN next_ := unistr('\0434');
              WHEN '\00E5' THEN next_ := unistr('\0435');
              WHEN '\00E6' THEN next_ := unistr('\0436');
              WHEN '\00E7' THEN next_ := unistr('\0437');
              WHEN '\00E8' THEN next_ := unistr('\0438');
              WHEN '\00E9' THEN next_ := unistr('\0439');
              WHEN '\00EA' THEN next_ := unistr('\043A');
              WHEN '\00EB' THEN next_ := unistr('\043B');
              WHEN '\00EC' THEN next_ := unistr('\043C');
              WHEN '\00ED' THEN next_ := unistr('\043D');
              WHEN '\00EE' THEN next_ := unistr('\043E');
              WHEN '\00EF' THEN next_ := unistr('\043F');
              WHEN '\00F0' THEN next_ := unistr('\0440');
              WHEN '\00F1' THEN next_ := unistr('\0441');
              WHEN '\00F2' THEN next_ := unistr('\0442');
              WHEN '\00F3' THEN next_ := unistr('\0443');
              WHEN '\00F4' THEN next_ := unistr('\0444');
              WHEN '\00F5' THEN next_ := unistr('\0445');
              WHEN '\00F6' THEN next_ := unistr('\0446');
              WHEN '\00F7' THEN next_ := unistr('\0447');
              WHEN '\00F8' THEN next_ := unistr('\0448');
              WHEN '\00F9' THEN next_ := unistr('\0449');
              WHEN '\00FA' THEN next_ := unistr('\044A');
              WHEN '\00FB' THEN next_ := unistr('\044B');
              WHEN '\00FC' THEN next_ := unistr('\044C');
              WHEN '\00FD' THEN next_ := unistr('\044D');
              WHEN '\00FE' THEN next_ := unistr('\044E');
              WHEN '\00FF' THEN next_ := unistr('\044F');
              ELSE next_ := next_char_;
           END CASE;

           IF out_string_ IS NULL THEN
              out_string_ := next_;
           ELSE
              out_string_ := out_string_ || next_;
           END IF;
        END LOOP;
     END IF;
  END IF;
  RETURN ltrim(out_string_, unistr('\FEFF'));
END Decode_1251;
22 июл 11, 10:43    [11010918]     Ответить | Цитировать Сообщить модератору
 Re: Как определить кодировку входного текста  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2814
Alexey Agafonov,

В общем случае, никак.
22 июл 11, 10:51    [11010976]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как определить кодировку входного текста  [new]
kontromorf
Member

Откуда:
Сообщений: 1
Flok, святой ты человек. Спасибо.
29 ноя 18, 10:53    [21748179]     Ответить | Цитировать Сообщить модератору
 Re: Как определить кодировку входного текста  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 7797
kontromorf
Flok, святой ты человек. Спасибо.
Имейте в виду, что данные типа LONG преобразуется к кодировке базы, так же, как CHAR, VARCHAR2 и CLOB.
Поэтому этот тип может быть неподходящим для вашей задачи, о которой мы ничего не знаем.
Аминь.
29 ноя 18, 11:14    [21748212]     Ответить | Цитировать Сообщить модератору
 Re: Как определить кодировку входного текста  [new]
vladimir74
Member

Откуда: Отсюда
Сообщений: 3604
kontromorf
Flok, святой ты человек. Спасибо.

если знаешь java лучше написать в ней небольщую ф-цию для распознования кодировки.
Если с явой плохо, спроси гугл. Там точно есть.
5 дек 18, 12:40    [21754212]     Ответить | Цитировать Сообщить модератору
 Re: Как определить кодировку входного текста  [new]
vladimir74
Member

Откуда: Отсюда
Сообщений: 3604
vladimir74
kontromorf
Flok, святой ты человек. Спасибо.

если знаешь java лучше написать в ней небольщую ф-цию для распознования кодировки.
Если с явой плохо, спроси гугл. Там точно есть.

лет 7-8 назад я сам у гугла спрашивал, и всё работало еще под 10тым Ораклом.
5 дек 18, 12:42    [21754220]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить