Clob с неподходящей кодировкой - PullRequest
0 голосов
/ 19 февраля 2019

Я хочу загрузить файл в переменную clos plsql, а затем выполнить некоторые преобразования регулярных выражений для него.У меня проблема в том, что каким-то образом я испортил свою кодировку.

Пока я пытался:

declare 
 l_filename varchar2(100) := 'sample.txt';
 l_clob clob;
 l_bfile bfile;
 begin
 dbms_lob.createtemporary(l_clob, true);
 l_bfile := bfilename( 'SAMPLE_DIR', l_filename );
 dbms_lob.fileopen( l_bfile );
 dbms_lob.loadfromfile( l_clob, l_bfile, dbms_lob.getlength( l_bfile ));
 dbms_lob.fileclose( l_bfile );
 dbms_output.put_line(l_clob);
 end;
/

Я создал плоский файл 'sample.txt' с 'тестовым файлом' вэто, и когда я в конечном счете печатаю это, я получаю '瑥 獴 楬 攊'.Кодировка, которую я использую в моей базе данных - это utf-8.Почему моя кодировка испортилась?

Я нашел какой-то онлайн-кодировщик https://www.urlencoder.org/. Когда я вставил туда свои китайские буквы и использовал UTF16-BE в качестве кодировки назначения, я получил 'test% 20file% 0A'.Но я до сих пор не знаю, почему моя кодировка испортилась.

1 Ответ

0 голосов
/ 20 февраля 2019

Вы уверены, что ваш набор символов БД - AL32UTF8, а ваш файл на диске - ASCII?Потому что это выглядит как-то, где-то AL16UTF16 (который, я думаю, такой же, как UTF-16BE).

Ваша тестовая строка "test file \ n" кодируется в байтах UTF8 0x746573742066696C650A.На самом деле у вас есть 5 азиатских символов, потому что третий является непечатным символом, LEFT-RIGHT ISOLATE.

Когда я конвертирую "тестовый файл \ n" в UTF16, я получаю следующее:

select dump( utl_i18n.raw_to_char( hextoraw('746573742066696C650A'), 'AL16UTF16' ), 1016 ) 
from dual;

Typ=1 Len=15 CharacterSet=AL32UTF8: e7,91,a5,e7,8d,b4,e2,81,a6,e6,a5,ac,e6,94,8a

select dump( '瑥獴⁦楬攊', 1016) from dual;

Typ=96 Len=15 CharacterSet=AL32UTF8: e7,91,a5,e7,8d,b4,e2,81,a6,e6,a5,ac,e6,94,8a

Обратите внимание, что последовательности байтов одинаковы.Второй dump() имеет Typ=96, что является значением NCHAR.Вы получаете те же наборы символов для вашей базы данных, что и моя?

select * from nls_database_parameters 
where parameter IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET' );

PARAMETER               VALUE
NLS_CHARACTERSET        AL32UTF8
NLS_NCHAR_CHARACTERSET  AL16UTF16
...