Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как определить кодировку входного текста / 9 сообщений из 9, страница 1 из 1
20.07.2011, 16:22
    #37359609
Alexey Agafonov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить кодировку входного текста
Добрый день, есть функция, которая на вход получает параметр типа LONG. Есть ли другая функция (может, из DBMS_xxx пакетов или еще какая) определения кодировки этого входного текста. Тут я не говорю о кодировке настроек базы и пр. Нужно определить только кодировку текста, переданного в функцию. В частности, необходимо решить задачу - если кодировка не UFT8, то прерывать работу функции.

Спасибо.
...
Рейтинг: 0 / 0
21.07.2011, 19:56
    #37362074
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить кодировку входного текста
Текст русско-английский? Или может быть на любом языке?
...
Рейтинг: 0 / 0
21.07.2011, 22:08
    #37362175
MazoHist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить кодировку входного текста
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
begin
  dststr:=convert(srcstr,'CL8MSWIN1251','UTF8');
exception
  when others then
    if sqlcode = - 12703  then
      --не utf-8
    end if;
end;
...
Рейтинг: 0 / 0
22.07.2011, 10:43
    #37362599
Flok
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить кодировку входного текста
немного не в тему, но все же.
как-то раз у меня была необходимость перекодировать строку, которая в которую передавался текст, прочитанный в кодировке utf-8 (хотя он был в 1251). Тогда мне пришлось писать функцию по перекодировке русских букв (вместо них в этой строке, естественно, выходили кракозябры).
вот текст этой функции, вдруг кому понадобится.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
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;
...
Рейтинг: 0 / 0
22.07.2011, 10:51
    #37362622
AlexFF__|
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить кодировку входного текста
Alexey Agafonov,

В общем случае, никак.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
29.11.2018, 10:53
    #39740249
kontromorf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить кодировку входного текста
Flok, святой ты человек. Спасибо.
...
Рейтинг: 0 / 0
29.11.2018, 11:14
    #39740262
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить кодировку входного текста
kontromorfFlok, святой ты человек. Спасибо.Имейте в виду, что данные типа LONG преобразуется к кодировке базы, так же, как CHAR, VARCHAR2 и CLOB.
Поэтому этот тип может быть неподходящим для вашей задачи, о которой мы ничего не знаем.
Аминь.
...
Рейтинг: 0 / 0
05.12.2018, 12:40
    #39742774
vladimir74
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить кодировку входного текста
kontromorfFlok, святой ты человек. Спасибо.
если знаешь java лучше написать в ней небольщую ф-цию для распознования кодировки.
Если с явой плохо, спроси гугл. Там точно есть.
...
Рейтинг: 0 / 0
05.12.2018, 12:42
    #39742775
vladimir74
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить кодировку входного текста
vladimir74kontromorfFlok, святой ты человек. Спасибо.
если знаешь java лучше написать в ней небольщую ф-цию для распознования кодировки.
Если с явой плохо, спроси гугл. Там точно есть.
лет 7-8 назад я сам у гугла спрашивал, и всё работало еще под 10тым Ораклом.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как определить кодировку входного текста / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]