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

Спасибо.
...
Рейтинг: 0 / 0
Как определить кодировку входного текста
    #37362074
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Текст русско-английский? Или может быть на любом языке?
...
Рейтинг: 0 / 0
Как определить кодировку входного текста
    #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
Как определить кодировку входного текста
    #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
Как определить кодировку входного текста
    #37362622
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Agafonov,

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


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